포인터 : 자료 그 자체가 아니라, 자료의 "주소"를 가리키는 값을 저장하는 자료형
프로그램에서 자료는 저장장치의 특정 메모리 칸에 저장되며, 이 칸을 주소로서 기록한다. 이름에 그 주소를 매칭시키는 것으로 해당 이름을 불렀을 때 그 주소에 접근할 수 있도록 한다. 그렇게 사용되는 주소 그 자체를 저장하는 변수를 포인터라고 한다.
int main()
{
int apple = 4;
printf("%d\n", apple);
int* fruit;
fruit = &apple;
}
int형 자료 apple을 4라고 저장했을 때, 이 apple은 저장장치의 특정 메모리칸에 저장될 것이다.
그리고 int 앞에 *를 붙여 포인터 변수를 만드는 데 이는 "해당 주소가 가리키는 값의 자료형", 즉 int* 자료형은 int를 가리키는 포인터라는 의미이다.
fruit = &apple;은 apple의 주소를 fruit이라는 포인터에 넣어주겠다는 뜻이다. 이 때 변수의 이름앞에 &를 넣어주면 이 변수의 값이 아니라 이 변수의 주소를 이용하겠다는 뜻이다.
=> fruit라는 int의 포인터를 다루는 변수에, 그 주소값으로서 apple의 주소를 대입하라는 뜻이다.
&apple와 반대로 포인터변수 앞에 *를 붙여 *fruit를 이용하면 이는 fruit가 가리키는 주소의 원래 변수의 값을 지정하는 것이다.
printf("apple이 가리키는 값 : %d\n", apple);
printf("int 포인터 fruit가 가지고 있는 값 그 자체 : %p\n", fruit);
printf("int 변수 apple의 주소 : %p\n", &apple);
printf("int 포인터 fruit가 가리키는 값 : %d\n", *fruit);
printf("int 포인터 fruit 자체의 주소 : %p\n", &fruit);
위와 같이 원래 변수와 그 변수를 가리키는 포인터를 *와 &를 적절히 이용해 출력할 수 있고, 포인터 또한 저장장치의 특정 메모리 칸에 저장되어 포인터 자체의 주소도 출력할 수 있다.
포인터의 특성
- 포인터는 포인터가 현재 가지고 있는 주소가 가리키는 대상에 직접 간섭할 수 있으며, 그 영향 역시 직접적으로 받는다. 단, 간섭하려면 포인터 변수를 이용할 떄 변수명에 *를 붙여서 "지금 이 포인터의 지정대상이 가진 값에 직접 접근하겠다"라고 명시하는 과정은 필요하다.
- 포인터는 말 그대로 주소값 그 자체를 저장하는 변수이다. 그리고, 이 주소값은 알아서 할당되는 것이 아니라 우리가 직접 주소 자체를 정확히 입력해주는 것. 고로, 잘못 집어주거나 이미 할당된 주소값을 우리가 임의로 연산하여 변경시킬 경우 우리가 의도하지 않은 주소의 값에 접근 및 간섭하는 문제가 생길 수 있다.
- 포인터는 원한다면 가리키는 변수를 바꿀 수 있으며, 바꿨을 경우 바꾸기 전에 가리키던 변수의 값이 어떻게 변한들
현재 포인터가 가리키는 값과는 아무런 연관이 없고 포인터 측에서 기존에 가리키던 주소가 가지고 있던 값을 변경할 수도 없게 된다.
'C++' 카테고리의 다른 글
C++) 클래스(Class) (0) | 2025.01.08 |
---|---|
C++) 동적 할당 (0) | 2025.01.06 |
C++) 인터페이스(Interface) (0) | 2024.12.26 |
C++) 템플릿(Template) (0) | 2024.12.26 |
C++) STL과 자료구조 (0) | 2024.12.23 |