포인터는 메모리의 주소값을 저장하는 변수이다.
[ 기본형태 : 포인터 타입* 포인터명 ]
Pointer, 가르키는 지시자인 포인터는 DataType 명시하는 대신, 자신이 가르킬 변수의 DataType을 명시한다.
다른 변수들은 선언 시 DataType에 의해 변수의 크기가 결정되는 반면,
포인터는 주소값을 저장하기 때문에, DataType과는 상관없이 항상 4byte의 크기를 유지한다.
<예시>
<결과값>
[포인터 문제]
다음 값이 어떻게 찍히는 지 생각해 보시오.
= 답
==문제풀이
printf("%d", *ptr++); printf("%d", *ptr);
: 포인터명 뒤에 붙은 ++은 증감연산자중에서 후 중감연산자로,
printf함수를 먼저 실행한 후에, 해당 값을 증가시킨다.
printf함수를 실행하고 나면, *ptr++ 앞의 *이 사라지고, ptr++만 남게 되는데,
이는 주소값을 증가하라는 의미임으로, ptr의 주소값은 그 다음주소로 이동하게 된다.
그렇기 때문에 그 다음 printf로 ptr의 값을 찍게 되면, ptr[1]의 값인 10이 찍히게 된다.
printf("%d", *ptr+1); printf("%d", *ptr);
: 포인터명 앞에 별표(*)를 찍음으로써, 값을 의미하며 *ptr 의 값은 10이 나오게 된다.
값에다가 +1을 한 값을 출력하라고 하였기 때문에, *ptr+1은 11이 찍히게 된다.
그러나, +1은 값자체를 증가시키는 것이 아니라, printf함수를 이용한 출력시에만 이용되는 것이기 때문에,
*ptr을 다시 출력하게 되면, 원래의 값 10이 나오게 된다.
printf("%d", ++*ptr); printf("%d", *ptr);
: 포인터명 앞에 붙은 ++은 증감연산자 중에서 선 증감연산자로,
해당 값을 먼저 증가 시킨 후, printf함수를 실행하기 때문에, 11이 찍히게 된다.
증감연산자는 앞의 +1과 달리 ptr의 값 자체를 증가시키기 때문에,
다음 printf함수로 출력하게 되면, 바뀐 값(11)이 찍히는 것을 알 수 있다.
printf("%d", *(ptr+1)); printf("%d", *ptr);
: 포인터명에 +1이 붙었으니, 해당값을 증가시켜야 하나, 별표(*)와 괄호로 구분되어 있으므로,
주소값을 증가시켜 값을 출력하라는 의미이기 때문에, 22가 찍히게 된다.
+1은 앞에서도 말했다 싶이, 값자체를 증가하는 것이 아니기 때문에,
*ptr을 다시 출력하면, 원래의 값 11이 찍히게 된다.
printf("%d", *ptr+=1); printf("%d", *ptr);
: *ptr+=1은 *ptr= *ptr+1과 같기 때문에, 값을 증가시키라는 의미이다.
그래서 11에 +1이 증가된, 12가 찍히게 된다.
+=은 값 자체가 증가된 것이기 때문에, *ptr를 찍게 되면, 증가된 값인 12가 찍히게 된다.
printf("%d", *++ptr); printf("%d", *ptr);
: ++은 포인터명 앞에 붙었으니, 증감연산자 중에서 선 증감연산자인데,
별표(*)와 포인터명 사이에 쓰였으므로, *(++ptr)과 동일하다.
그러므로, ptr의 주소값을 증가시킨 후에, 값을 출력하라는 의미로,
주소값이 증가된 22가 찍히게 된다.
++은 해당 값 자체를 증가 시키기 때문에, 다시 ptr을 찍게 되면 22가 찍히게 된다.
printf("%d", (*ptr)++); printf("%d", *ptr);
: 괄호의 값을 먼저 계산해야 함으로, 후증감연산자는 값을 증가시킨라는 의미이다.
그렇기 때문에, 처음에 printf함수로 출력시, 22가 찍히게 되지만,
2번째로 찍게 되면, 22에서 값이 1증가된 23이 찍히게 된다.