코드


#include <stdio.h>


int main(){

int i = 10;

int *p = NULL;

int check = 0;


p = &i;

printf("1. p = &i;\n");

printf(" 변수 i 주소  &i = %d    i의 값  i = %d \n", &i, i);

printf("포인터  p의 값 p = %d    포인터 p가 가리키는 주소에 저장된 값  *p = %d \n",  p, *p);


p++;

printf("2. p++; \n");

printf(" 변수 i 주소  &i = %d    i의 값  i = %d \n", &i, i);

printf("포인터  p의 값 p = %d    포인터 p가 가리키는 주소에 저장된 값  *p = %d \n",  p, *p);


p--;

printf("3. p--; \n");

printf(" 변수 i 주소  &i = %d    i의 값  i = %d \n", &i, i);

printf("포인터  p의 값 p = %d    포인터 p가 가리키는 주소에 저장된 값  *p = %d \n\n",  p, *p);


printf("--------------------------1--------------------------\n");

p = &i;

printf("초기화. p = &i; \n");

printf(" 변수 i 주소  &i = %d    i의 값  i = %d \n", &i, i);

printf("포인터  p의 값 p = %d    포인터 p가 가리키는 주소에 저장된 값  *p = %d \n\n",  p, *p);

check = 0;

//초기화.


check = *p++;

printf("1> check = *p++; \n");

printf(" 변수 i 주소  &i = %d    i의 값  i = %d \n", &i, i);

printf("포인터  p의 값 p = %d    포인터 p가 가리키는 주소에 저장된 값  *p = %d \n",  p, *p);

printf("변수 check = %d \n\n", check);

//*, =, ++의 실행 순서는...!

// * = ++  이다. 1)p가 가리키는 변수의 값을 가져오고 2)check에 넣고 3)주소값(포인터변수) p를 ++한다.

//왜 *p를 ++하지 않지?? 왜 p에다가 ++되어지는 거지?


printf("---------------------------2-------------------------\n");

p = &i;

printf("초기화. p = &i; \n");

printf(" 변수 i 주소  &i = %d    i의 값  i = %d \n", &i, i);

printf("포인터  p의 값 p = %d    포인터 p가 가리키는 주소에 저장된 값  *p = %d \n\n",  p, *p);

check = 0;

//초기화.


check = (*p)++;

printf("2> check = (*p)++; \n");

printf(" 변수 i 주소  &i = %d    i의 값  i = %d \n", &i, i);

printf("포인터  p의 값 p = %d    포인터 p가 가리키는 주소에 저장된 값  *p = %d \n",  p, *p);

printf("변수 check = %d \n\n", check);

//* = ++

//1)p가 가리키는 변수 값을 가져오고 2)check에 넣고 3)p가 저장한 주소가 가리키는 값에 ++한다.


printf("---------------------------3-------------------------\n");

p = &i;

i = 0;

printf("초기화. p = &i; i=0; \n");

printf(" 변수 i 주소  &i = %d    i의 값  i = %d \n", &i, i);

printf("포인터  p의 값 p = %d    포인터 p가 가리키는 주소에 저장된 값  *p = %d \n\n",  p, *p);

check = 0;

//초기화.


check = *++p;

printf("3> check = *++p; \n");

printf(" 변수 i 주소  &i = %d    i의 값  i = %d \n", &i, i);

printf("포인터  p의 값 p = %d    포인터 p가 가리키는 주소에 저장된 값  *p = %d \n",  p, *p);

printf("변수 check = %d \n\n", check);

// ++ * =

//1)p가 가리키는 주소를 ++하고 2)p가 가리키는 주소에 저장된 값을 가져오고 3)p가 가리키는 주소에 저장된 값을 check에 저장한다.


printf("---------------------------4-------------------------\n");

p = &i;

i = 9;

printf("초기화. p = &i; i = 9; \n");

printf(" 변수 i 주소  &i = %d    i의 값  i = %d \n", &i, i);

printf("포인터  p의 값 p = %d    포인터 p가 가리키는 주소에 저장된 값  *p = %d \n\n",  p, *p);

check = 0;

//초기화.


check = ++*p;

printf("4> check = ++*p; \n");

printf(" 변수 i 주소  &i = %d    i의 값  i = %d \n", &i, i);

printf("포인터  p의 값 p = %d    포인터 p가 가리키는 주소에 저장된 값  *p = %d \n",  p, *p);

printf("변수 check = %d \n\n", check);

//* ++ =

//p가 가리키는 주소에 저장된 값을 가져오고 2)p가 가리키는 주소에 저장된 값에 ++하고 3)p가 가리키는 주소에 저장된 값을 ++한다.

return 0;

}


4>에서 ++가 전치수식이라고 항상 가장 먼저 처리되는건 아닌가요?


출력


1. p = &i;

 변수 i 주소  &i = 14089596    i의 값  i = 10

포인터  p의 값 p = 14089596    포인터 p가 가리키는 주소에 저장된 값  *p = 10

2. p++;

 변수 i 주소  &i = 14089596    i의 값  i = 10

포인터  p의 값 p = 14089600    포인터 p가 가리키는 주소에 저장된 값  *p = -858993460

3. p--;

 변수 i 주소  &i = 14089596    i의 값  i = 10

포인터  p의 값 p = 14089596    포인터 p가 가리키는 주소에 저장된 값  *p = 10


--------------------------1--------------------------

초기화. p = &i;

 변수 i 주소  &i = 14089596    i의 값  i = 10

포인터  p의 값 p = 14089596    포인터 p가 가리키는 주소에 저장된 값  *p = 10


1> check = *p++;

 변수 i 주소  &i = 14089596    i의 값  i = 10

포인터  p의 값 p = 14089600    포인터 p가 가리키는 주소에 저장된 값  *p = -858993460

변수 check = 10


---------------------------2-------------------------

초기화. p = &i;

 변수 i 주소  &i = 14089596    i의 값  i = 10

포인터  p의 값 p = 14089596    포인터 p가 가리키는 주소에 저장된 값  *p = 10


2> check = (*p)++;

 변수 i 주소  &i = 14089596    i의 값  i = 11

포인터  p의 값 p = 14089596    포인터 p가 가리키는 주소에 저장된 값  *p = 11

변수 check = 10


---------------------------3-------------------------

초기화. p = &i; i=0;

 변수 i 주소  &i = 14089596    i의 값  i = 0

포인터  p의 값 p = 14089596    포인터 p가 가리키는 주소에 저장된 값  *p = 0


3> check = *++p;

 변수 i 주소  &i = 14089596    i의 값  i = 0

포인터  p의 값 p = 14089600    포인터 p가 가리키는 주소에 저장된 값  *p = -858993460

변수 check = -858993460


---------------------------4-------------------------

초기화. p = &i; i = 9;

 변수 i 주소  &i = 14089596    i의 값  i = 9

포인터  p의 값 p = 14089596    포인터 p가 가리키는 주소에 저장된 값  *p = 9


4> check = ++*p;

 변수 i 주소  &i = 14089596    i의 값  i = 10

포인터  p의 값 p = 14089596    포인터 p가 가리키는 주소에 저장된 값  *p = 10

변수 check = 10



++가 후치수식이라고 항상 가장 늦게 하는 건 아닌가요?

1> check = *p++;

2> check = (*p)++;


1>은 포인터값을 증가시키고

2>는 포인터가 가리키는 변수의 값을 증가시키는데


*p를 하면 *p가 i로 대체된다고 볼 수 없는 건가요?(만일 대체해버린다고 하면 1>과 2>의 처리는 같아야 할텐데)


1> check = *p++;

2> check = (*p)++;

3> check = *++p;

4> check = ++*p;


이 4가지가 어떻게 실행되는지 헷갈리네요... 그리고 ++의 실행 순서가 이해가 안됩니다...

그냥 붙여 놓은 대로 실행되는거 같기도 하고... "++에 *p를 붙이느냐 p를 붙이느냐"가 차이점인듯도 하고...