728x90
포인터를 활용하면 '원본의 변경'을 할 수 있다. 라고 배운다.
하지만, 변경이 안되는 헷갈리는 부분이 있어서 글로 남긴다.
#include <stdio.h>
void PointerChange(int *pointer) {
pointer = pointer + 10; //주소 자체를 변경
}
int main(void) {
int a = 10;
int *p = &a;
printf("a = %d\n", a);
printf("p가 가리키는 주소 = %u\n", p);
PointerChange(p);
printf("p가 가리키는 주소 = %u\n", p);
return 0;
}
변수 a = 10이고 포인터 변수 p 는 a를 가리키고 있다.
PointerChange함수는 매개변수로 포인터 변수를 받고, 받은 포인터 변수를 10증가시킨다.
그리고 다시 p의 주소가 증가 되었는지 확인한다.
확인을 해보면,
p가 증가하지 않았다.
Why?
포인터 매개변수를 변경한다는건 가리키고 있는 주소를 변경한다는 의미이다.
하지만 이것은 불가능하다.
void PointerChange(int *pointer) {
pointer = pointer + 10; //주소 자체를 변경
}
여기서 인자로 포인터p를 전달하면, 함수 안에서 포인터 p가 복사되어 그 복사본인 포인터 변수 pointer를 변경하기 때문이다.
즉, 복사된 것을 변경해봤자 원본인 p는 변경되지 않는것이다.
무작정 함수에서 매개변수를 포인터로 주면 원본이 변경된다! 라고 외운 초보자들이라면 실수하기 쉬운 부분이다.
But
포인터가 가리키고 있는 주소의 데이터 값을 변경시키는 것은 가능하다.
PointerChange함수를 이렇게 변경해보자
void PointerChange(int *pointer) {
*pointer = 15;
}
이것은 포인터가 가리키는 주소에 있는 데이터를 바꾸는 것이기 때문이다.
요약하자면,
함수의 매개변수로 포인터를 전달 했을 때, 그 포인터가 가리키는 주소에 있는 데이터를 변경하는 것은 '원본 변경'이 가능하다.
하지만, 포인터가 가리키는 주소를 변경하는 것은 불가능하다(투 포인터를 사용하면 가능하긴함). 왜냐면 함수에서는 매개변수가 '복사'되어 사용되기 때문이다.
728x90
'C프로그래밍 > 개인 공부' 카테고리의 다른 글
2차원 배열 포인터 형으로 함수 인자로 전달하기 (0) | 2023.02.12 |
---|---|
C언어 - 함수의 포인터 (0) | 2023.01.07 |
C언어 - 포인터의 배열, 배열의 포인터 (0) | 2023.01.05 |
C언어 - 이중 포인터 (0) | 2023.01.03 |
C언어 - 연결리스트 (0) | 2022.12.20 |