포인터 연산은 헷갈리기 쉬우므로 다음 예제를 통해 한번에 확실하게 구분해보자.
#include <stdio.h>
int main(void)
{
int i = 10;
int* pi = &i;
printf("i=%d, pi=%p\n", i, pi);
(*pi)++; // pi가 가리키는 대상(i 값)을 증가
printf("i=%d, pi=%p\n", i, pi);
*pi++; // pi(주소)를 증가 (pi를 다음 int 위치로 이동)
printf("i=%d, pi=%p\n", i, pi);
*++pi; // pi를 증가시키고 (다음 int 위치로 이동), 그 위치의 값을 참조 (하지만 아무 연산도 수행하지 않음)
printf("i=%d, pi=%p\n", i, pi);
++*pi; // pi가 가리키는 대상의 값을 증가
printf("i=%d, pi=%p\n", i, pi);
return 0;
}
첫번째와 두번째는 확실히 구분해야한다.
첫번째는 포인터가 가리키는 대상, 즉 i를 증가시키는것이고
두번째는 포인터 그자체 (주소) 를 증가시키는 것이다.
세번째와 네번째는 위 예제에서 특별한 변화를 출력하지 않는데,
그 이유는 세번째는 포인터 그자체인 주소를 증가시키고, 그 주소의 값을 참조하는것인데 다음주소에 할당된 값이 없어 아무런 연산수행을 하지않는다.
네번째는 포인터가 가리키는 대상의 값을 증가하여 그값을 원래 주소에 저장(대입)한다. 하지만 이미 세번째 연산에서 포인터의 주소를 증가시켜 저장하더라도 새로운 주소에 저장되었기에 출력되어지지 않는다.

'C' 카테고리의 다른 글
동적 메모리 할당 (0) | 2024.06.21 |
---|---|
백준 10818번 최대,최소 문제에서의 VLA와 동적할당 이슈 (1) | 2024.06.20 |
포인터 연습 예제1 (0) | 2024.06.03 |
문자열 배열 연습 4 (0) | 2024.05.29 |
문자열 배열 연습 3 (0) | 2024.05.29 |