#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이됩니다.
따라서 결과는 다음 처럼 출력됩니다.
감사합니당 ㅎㅎ
변수의 정체와 역할 파악 (0) | 2018.01.10 |
---|---|
Pointer 분석 (1) - 값과 주소의 이동파악 (0) | 2018.01.05 |
BabyGin - Count Sort (0) | 2018.01.04 |
C언어 #include 지시어의 <> 와 ""의 차이점 (1) | 2017.12.27 |
pointer's pointer로 결합도 낮추기 void로 (0) | 2017.10.02 |
댓글 영역