*와 &가 계속 헷갈렸는데 집과 집주소로 생각하면 그나마 쉽게 이해할 수 있습니다.
비유를 해서 이해하면 쉬운데
*는 집에 사는 사람을 뜻하고 포인터 변수 그 자체와 &는 집주소를 뜻한다고 생각하면 됩니다.
////이거는 방어막 같은겁니다. 저기를 베를린 장벽 같은거로 생각하고 띄워서 이해하시면 됩니다!!!!!
주석 아님!!!
int * ptr;
이걸 볼때 처음에 저는 *ptr로 이해했는데 그게 아니라
<int * //// ptr;> 였습니다.
즉 <int 형이면서 포인터 변수인 //// ptr을 선언하겠다>. 입니다.
아까 포인터 변수 그 자체는 집주소에 비유하면 쉽다고 했는데 그러면
int * //// ptr ;
= int 형이면서 포인터 변수인 //// ptr을 선언하겠다.
즉 ptr이라는 집주소 변수를 선언하겠다.
이렇게 이해해봅시다.
int * ptr = #
이건 뭘까요?? 아까 &도 집주소라고 말했었습니다.
그러면
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이 증가
변수의 크기만큼 주소값이 커지는 것입니다.
'개발 공부 > C언어' 카테고리의 다른 글
#13 C언어 변수형태/상수형태 배열과 포인터의 차이점과 공통점 (0) | 2022.08.02 |
---|---|
#12 C언어 포인터 앞에 int double 같은 자료형을 붙여줘야 하는 이유 (0) | 2022.08.02 |
#10 C언어에서 헷갈리는 따옴표 " ' 구별해서 쓰는 법 (0) | 2022.08.02 |
#9 C언어 scanf 함수에서 문자열 입력할때 공백처리 (0) | 2022.08.02 |
#8 C언어 배열이름 앞에는 왜 &를 안 붙일까? (0) | 2022.08.01 |
댓글