본문 바로가기
개발 공부/C언어

#11 C언어 *와 &가 헷갈려서 포인터를 쉽게 설명해 보았다

by 반달bear 2022. 8. 2.
반응형

 

*와 &가 계속 헷갈렸는데 집과 집주소로 생각하면 그나마 쉽게 이해할 수 있습니다.

비유를 해서 이해하면 쉬운데 

*는 집에 사는 사람을 뜻하고 포인터 변수 그 자체와 &는 집주소를 뜻한다고 생각하면 됩니다.

 

////이거는 방어막 같은겁니다. 저기를 베를린 장벽 같은거로 생각하고 띄워서 이해하시면 됩니다!!!!!

주석 아님!!!

 

int * ptr; 

이걸 볼때 처음에 저는 *ptr로 이해했는데 그게 아니라

<int * //// ptr;> 였습니다.

즉 <int 형이면서 포인터 변수인 //// ptr을 선언하겠다>. 입니다.

 

 

아까 포인터 변수 그 자체는 집주소에 비유하면 쉽다고 했는데 그러면

int * //// ptr ; 

= int 형이면서 포인터 변수인 //// ptr을 선언하겠다. 

 ptr이라는 집주소 변수를 선언하겠다. 

이렇게 이해해봅시다.

 

 

int * ptr = &num;

이건 뭘까요?? 아까 &도 집주소라고 말했었습니다.

그러면

int * //// ptr = &num ;

= int 형이면서 포인터 변수 //// ptr을 선언하고, 여기에 num의 주소값을 저장하겠다.

즉 ptr이라는 집주소 변수를 선언하고 num의 집주소를 ptr이라는 변수에 저장하겠다. 

왜냐??? 집주소니까 집주소 변수에 저장하는거!! 택배 보낼때 집주소 칸에는 집주소만 쓴다고 이해하시면 됩니다.

 

 

자 그럼 

int * ptr = &num ;

*ptr = 10 ; 

이건 뭘까요

 

아까 *는 집에 사는 사람이라고 했습니다.

그럼 int * //// ptr = &num ;

*ptr =10 ;

  ptr이라는 집주소에 num 집주소를 저장했는데 

ptr이라는 집주소에 사는 사람을 10으로 바꾸겠다는 뜻입니다.

 

 

아까 ptr이라는 집주소에 num 집주소를 저장했으니까 

*ptr 즉 ptr [ptr이라는 집주소 = num이라는 집주소]에  * [사는 사람]을 10으로 바꾸겠다 로 이해하면 됩니다.

쉽죠?

 

조금 더 해보겠습니다.

 

자 그럼

int * ptr = &num ;

(*ptr) ++ ;

는 뭘까요?

 

ptr 집주소에 num 집주소를 저장하고

ptr 집주소에 사는 사람을 +1 연산해준다.

(엄밀히 말하면 후위 연산자이기에 해당 라인에 있는 나머지 식을 연산한 후 라인이 바뀔 때 ptr 집주소에 사는 사람을 +1 해주는 것)

괄호가 이해 안되는 사람은 이 링크 참고 #5 C언어 (++i, i++) 후위연산 전위연산 차이점 쉽게 이해하는 법 (tistory.com)

 

 

이제 마지막!!!!!!!!!!!!

int * ptr = &num ;

*(ptr+1) =10 ; 

이건 뭘까요???

 

 

int * //// ptr = &num ;

*(ptr+1) = 10 ;

 

 

ptr 집주소에 num 집주소 저장한 후에 

(ptr+1) [ptr 집주소에 +1 해주고]  *[거기 사는 사람]을 10으로 바꾼다는 것입니다.

 

 

이때 주의할 점 

int형 포인터 변수가 ptr이기 때문에 ptr+1한다고 진짜 +1 되는게 아니라 

주소값 형식으론 +4가 됩니다..

int 형은 +4가 증가되고 만약 double형이면 주소값은 +8이 증가

변수의 크기만큼 주소값이 커지는 것입니다.

 

반응형

댓글