01. 포인터와 메모리
포인터는 메모리 주소를 저장하는 변수를 의미한다.
포인터 변수도 일반 변수를 선언할 때처럼 int나 char와 같은 자료형을 지정한다. 다만 다음 처럼 자료형과 변수 이름 사이에 별표( * )를 추가한다. Ex. 자료형 *( 포인터_변수_이름 );
포인터 변수 선언과 초기화 [Practice 02-01-01]
역참조 연산자( * )로 데이터 접근 [Practice 02-01-02]
다중 포인터( multiple pointer ), 다중 포인터 변수 선언 [Practice 02-01-03]
포인터를 가리키는 포인터( pointer to pointer )를 의미하는 다중 포인터( multiple pointer )를 이용하여 포인터 변수의 주소를 저장하는 또 다른 포인터를 만들 수 있다.
배열과 포인터
배열 선언( fixed array declaration )과 원소에 접근하기 [Practice 02-01-04]
출력 결과
배열 원소의 메모리 주소 확인하기 [Practice 02-01-05]
출력 결과, 16진수의 메모리 주소가 4씩 차례로 증가하는 것을 확인 가능
배열 원소의 주소와 포인터 연산의 결과 비교하기 [Practice 02-01-06]
포인터 연산으로도 각 원소에 접근할 수 있다.
인덱스로 접근하나 포인터 연산으로 접근하나 똑같다.
출력 결과, &lotto[0] == lotto + 0
배열과 포인터가 같은지 확인하기 [Practice 02-01-07]
출력 결과
동적 메모리 할당( dynamic memory allocation ), new, delete로 동적 메모리 할당하고 해제하기 [Practice 02-01-08], [Practice 02-01-09]
프로그램 실행 중에도 필요한 크기의 메모리를 운영체제에 요청하여 사용할 수 있는 방법
C++ 언어에서 동적 메모리를 할당하려면 new 키워드를 사용한다.
동적 메모리 할당 >> *자료형 변수_이름 = new 자료형;
new로 할당된 메모리는 필요 없는 시점에 delete 키워드로 반드시 직접 해제해야 한다.
동적 메모리 해제 >> delete 변수_이름;
출력 결과, 일반적인 동적 메모리 할당과 해제
배열 형태의 동적 메모리 할당>> *자료형 변수_이름 = new 자료형[크기];
배열 형태의 동적 메모리 해제>> delete[] 변수_이름;
출력 결과, 배열에서의 동적 메모리 할당과 해제, 메모리 누수( memory leak )가 발생하기 쉬우므로 메모리 해제를 잘 해야한다. 동적 메모리를 사용할 때는 항상 new와 delete를 한 쌍으로 생각하고 사용해야 한다.
방문하는 손님 수만큼만 빵 만들기 [Practice 02-01-10]
출력 결과
동적 메모리로 정수 100개를 저장할 수 있는 배열을 생성한 후 해제하는 코드 만들기 [Practice 02-01-11]
02. 함수와 구조체
함수 선언의 4가지 필수 요소
일반 변수를 매개변수로 활용하기 [Practice 02-03-01]
출력 결과, 함수 c는 parameter로 받은 i가 양수이면 음수로 바꾸도록 만드는 함수이다. 기대했던 결과는 a의 값 3이 -3으로 변경되는 것인데, 그대로 출력된 이유는 parameter인 i가 함수 c 내부에서만 효력있는 지역 변수이기 때문이다. 이러한 문제를 해결할 수 있는 방법의 하나는 포인터 변수를 매개변수로 활용하는 것이다.
포인터를 매개변수로 사용하기 [Practice 02-03-02]
출력 결과, 포인터 변수는 ‘메모리 주소를 저장하는 변수’ 즉, 함수가 호출될 때 주소 값을 전달했으므로 이를 받으려면 포인터 변수로 선언해야 한다.
배열을 매개변수로 사용하기 [Practice 02-02-03]
출력 결과
구조체 만들기, 구조체를 매개변수로 사용하기 [Practice 02-03-03] [Practice 02-03-04]
<aside> 💡
앞에서, 일반 변수, 포인터, 배열을 매개변수로 이용하는 방법이 있었다. 그런데 이 방법들은 모두 단일 자료형만 취급할 뿐 여러 가지 형식의 데이터를 하나의 매개변수로 전달 할 수는 없었다. 이를 해결하는 방법의 하나로 구조체가 있다.
</aside>
출력 결과
출력 결과