상세 컨텐츠

본문 제목

포인터주소이동 개념 손코딩으로 출력값 알아보기

C 언어

by ChrisMare 2017. 10. 2. 18:34

본문

#pragma warning(disable: 4996)

#include <stdio.h>

main()

{

 int *ptr;

 int n[] = { 5,10,22,34,36,44 };

 ptr = n;


 printf("%d ", *ptr++);  printf("%d\n", *ptr);

 printf("%d ", *ptr + 1); printf("%d\n", *ptr);

 printf("%d ", ++*ptr);  printf("%d\n", *ptr);

 printf("%d ", *(ptr+1)); printf("%d\n", *ptr);

 printf("%d ", *ptr+=1);  printf("%d\n", *ptr);

 printf("%d ", *++ptr);  printf("%d\n", *ptr);

 printf("%d ", (*ptr)++); printf("%d\n", *ptr);


}


해설 스타또~~!!!


int *ptr;

int n[] = {5, 10, 22, 34, 36,, 44};

int ptr = n;


여기까지 int형 포인터 변수 ptr이라는 것을 선언하고 그 ptr이 n의 첫번쨰 주소를 가르키는 중입니다.


그 뒤

저희는 오른쪽 왼쪽 법칙이라는 걸 배워 봅시다

먼저 오른쪽을 생각한뒤 왼쪽을 적용시키면됩니다. 어느 강사님에게 배웠습니다.


자! 바로 적용 갑니다.


*ptr++ 라는건 ptr의 주소를 후처리로 +1하라는 예기인데 후처리이기떄문에 해당 코드가 종료되기 된 후에 적용되는것입니다.

따라서 *ptr을 합니다. *ptr은 ptr의 주소가 가르키는 값을 나타내고있습니다. 현재 ptr은 n의 첫번쨰 주소를 가르키기 떄문에

n[0]의 값은 5입니다. 따라서 출력이 5가 찍힌 뒤에 후처리로 인해서 ptr이 가르키는 n의 첫번쨰 주소에서 다음 주소를 가르키게 됩니다.!!!

그러므로 ptr은 이제부터는 보기그림과 같이 n[1]번쨰 주소를 가르킵니다.




그리고 *ptr 은 n[1]의 값을 찍는 것이므로 10을 출력합니다.


다음은 *ptr + 1 인데요 이것은 오른쪽왼쪽법칙에 따라서 나눠 드릴꼐여

ptr기준으로 오른쪽에 + 부호가 단독으로 처리 안되므로 왼쪽의 포인터(*)를 처리한뒤  + 1을 하게됩니다.

따라서 *ptr은 현재 ptr이 가르키는 곳의 값은 10(n[1]) 이며 그 + 1 을 하게되어서 11이라는 값이 찍힙니다. 하지만

*ptr은 여전히 10입니다.  ptr이 가르키는 값이닌까요....


다음은 ++*ptr인데요 ptr을 기준으로 오른쪽에는 아무것도 없으니 바로 왼쪽으로 갑니다.

ptr에 * 가 적용되어서 ptr이 가르키는 값을 ++선처리로 출력하라는 의미이니 10의 값에다가 +1한 11이 찍힙니다.




다음은 *(ptr+1)인데요 이것도 역시 오른쪽인 + 부터 합니다 하지만 여기서는 괄호가 있으니 +1을 하군요

그러면 ptr이 가르키는 곳이 n[1]의 주소에서 + 1을 하는 것이니 다음 주소의 n[2]를 가르키게 됩니다.





그리고 그 가르키는 곳의 값을 출력하라는 의미이네요... 그 뒤에 *ptr을 출력하는 것인데요 여기서 가볍게 생각하면 ptr의 주소가 이전된것 처럼 보이지만 ptr의 주소가 완전히 바뀐것이아니라 가르키는곳의 값을 찍는 것이였습니다. 음.... 주소가 바뀌려면 ptr = ptr+1이라는 것처럼 주소의 값을 바꿔 줘야합니다. 하지만 여기서는 주소의 위치가 가르키는 값을 찍으라는(ptr+1)이니 실제로는 바뀌지 않았습니다.

따라서 ptr은 아직 현재 n[1]을 가르킵니다.  따라서 11의 값이 출력됩니다.




다음은 *ptr+=1도 오/왼법칙을 적용하는데 이것은 풀어 쓰면 *ptr = *ptr+1이라는 의미인데요

+=1이라는것이 왼쪽에 있는 변수전체에다가 +1을 하는 의미이닌까요

따라서 ptr이 가르키는 곳의 값을 + 1 시키라는 의미이니 n[1]의 값이 11에서 12로 바뀝니다.


다음은 *++ptr인데요 ptr을 기준으로 오른쪽에 없으니 왼쪽 ++를 먼저 적용시킵니다.

따라서 *(ptr=ptr+1)인데요 이거는 선처리 이니 먼저 적용됩니다. 따라서 ptr이 가르키는 곳이 다음 주소로 바뀌게 됩니다.




이제 왼쪽에 남은 *를 적용시켜서 ptr의 주소가 가르키는 곳의 값을 찍으라는의미입니다. 따라서 n[2]의 값인 22가 출력하게 됩니다.


다음은 (*ptr)++ 인데요 이것도 적용시키면 ptr의 기준으로 오른쪽이 없으니 왼쪽 *를 적용시켜서 

ptr이 가르키는 곳의 값을 가지고 ++하라는 의미이니 ++는 후처리이기 떄문에 코드가 종료하기 전까지 수행되지 않습니다.

따라서 *ptr의 값인 22가 출력되고난후 (*ptr) = (*ptr) + 1; 이 적용되서 ptr이 가르키는 곳의 값이 + 1 해서 23이됩니다.


따라서 결과는 다음 처럼 출력됩니다. 



감사합니당 ㅎㅎ


관련글 더보기

댓글 영역