포인터
- 포인터란? ->데이터의 주소를 저장하기 위한 주소 변수
포인터의 활용도
- 데이터에 간접참조하기 위해 사용된다.
- 프로그램을 힙 메모리 영역에 사용하는데 쓰인다.
- 인터넷, 키보드, 모니터와 같은 외부의 메인 메모리 영역에 힙 메모리와 리소스들을 접근하는데 사용된다.
- 포인터는 또한 매개변수들을 전달하는데 사용된다.(swap함수를 떠올리면 알 수 있다)
주 메모리의 구조

- 활성화 레코드(또는 스택 프레임):함수 상태를 기록하고 복원하기 위한 것으로써, 해당 함수의 리턴 값, 값 파라미터, 지역 변수, 귀환 주소 등의 정보가 기록
- 즉, main함수내에서 변수를 선언하거나 함수를 호출할때마다 스택 프레임이 생성된다.
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int a = 10;
int* p;
p = &a;
printf("%x\n", p);
printf("%x\n", &a);
printf("%x\n", &p);
printf("%d\n", *p);
return 0;
}
printf("%x\n", p);와 printf("%x\n", &a);는 같은 주소값을 출력하는데, p는 a의 주소를 가리키기 때문이다.
- 하지만, 포인터 변수도 자신의 주소값이 있기 때문에,
printf("%x\n", &p);를 보면 위의 두 줄과 다른 주소값을 출력한다.
- 데이터에 간접 참조하고 싶으면 '*' 역참조 연산자를 쓰자.
배열을 힙 영역(dynamic)에 메모리 할당하기
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
int* p;
int size;
cin >> size
p = (int*)malloc(sizeof(int) * size);
for(int i = 0; i<size;i++){
p[i] = i;
cout<<p[i]<<endl;
}
free(p);
p = new int[5];
}
- malloc함수를 사용하기 위해서는, 반환형 포인터와 할당하고자 하는 메모리 타입을 명시해야한다.
- 기본적으로 void형 포인터를 반환하기 때문에, int형 메모리를 할당하고 싶으면 앞에 (int*)를 붙여서 casting하자
(sizeof(int)*size)를 한 이유는 입력된 size만큼 int형 메모리를 할당하고 싶어서다.
- for loop를 돌리면 값을 연속적으로 대입해주기 때문에 배열이다.
- c++에서는
p = new int[5];로 할당하고 delete [] p;로 메모리를 해제할 수 있다.(new,delete를 계속쓰기 귀찮아서 나중에는 STL의 vector를 사용한다)