포인터는 주소값을 담을 수 있는 변수이다.
왜 사용을 하는가? 사용 영역에 벗어난 경우에도 메모리에서 주소를 참조하여 값을 변경할 수 있다.
main 함수가 아닌 다른 함수에서 값을 변경하고자 할 때 쓰인다.
데이터형* 포인터변수명;
int* a;
int*b, c; // b는 포인터 변수, c는 일반 변수
int* a, b;
b = 10;
a = &b;
cout << "*a = " << *a << endl; // 10
cout << "b = " << b << endl; // 10
cout << "*a 주소 = " << a << endl; // 000000297C8FFA64
cout << "b 주소 = " << &b << endl; // 000000297C8FFA64
*a = *a + 1;
cout << "b의 값은 " << b << endl; // 11
b의 주소값을 포인터변수 a에 넣어 a를 변경하면
b또한 변경이 되는 것을 알 수 있다.
int* p = new int;
new
키워드를 사용하게 되면 변수를 이용하여 초기화하지 않아도 포인터를 초기화할 수 있다.
delete p;
new
키워드를 사용하여 초기화한 사용하지 않는 포인터변수는 delete를 이용하여 메모리 환수가 가능하다.
double* p = new double[3];
p[0] = 1.1;
p[1] = 2.2;
p[2] = 3.3;
cout << p[0] << endl; // 1.1
cout << p[1] << endl; // 2.2
p = p + 1;
cout << p[0] << endl; // 2.2
cout << p[1] << endl; // 3.3
p[1] = p[1] + 1;
cout << p[1] << endl; // 4.3
p = p - 1;
delete[] p;
배열 형식으로 부여도 가능하다.
단 메모리폴에 환수할 경우 delete[]
를 사용해줘야 한다.
일반적인 배열이름에 연산한다는 것은 불가하나
위 코드의 경우 포인터이기 때문에 주소를 한칸씩 미룬다는 의미로 쓸 수 있다.