{
char **p, **q, *tmp, *w[5];
char s[] = "abcd"; int i;
for (i = 0; i < 5; ++i) w[i] = s + i;
p = &w[0];
q = &w[0] + 3;
tmp = *p;
*p = *q;
*q = tmp;
for (i = 0; i < 5; ++i) printf("%c", **(p++));
}
이거 출력값이 dbca인데 왜 그런지 설명가능한 사람 제발
{
char **p, **q, *tmp, *w[5];
char s[] = "abcd"; int i;
for (i = 0; i < 5; ++i) w[i] = s + i;
p = &w[0];
q = &w[0] + 3;
tmp = *p;
*p = *q;
*q = tmp;
for (i = 0; i < 5; ++i) printf("%c", **(p++));
}
이거 출력값이 dbca인데 왜 그런지 설명가능한 사람 제발
포인터니까요!
낮에 다시 와서 댓글 달겠음
일단 배열 s를 [] 없이 호출하면 s[0]의 주소값을 반환함. 그리고 주소값에 +n하면 다음 n번째 데이터의 주소값이 나오고, 그러니까 배열 w에는 s[0]부터 s[4]의 "주소값"이 들어감.
그리고 p랑 q에는 w[0]의 주소값이랑 w[3]의 주소값이 들어가는건 쉽게 알수 잇을거고, tmp = *p; *p = *q; *q = tmp; 는 알기쉽게 치환하면 tmp = w[0]; w[0] = w[3]; w[3]=tmp; 랑 같은건 알겠지. 이 과정에서 w의 배열의 데이터가 s01234 에서 s31204로 바뀌게 됨.
마지막 printf 부분에서 p값 자체는 w[0] 위치 그대로 가리키고 있으니까 p는 매 단계마다 w[0]부터 w[0]+1, +2, +3...의 주소를 순차적으로 증가하고, 결국 그 값을 따라가면 s 31204 순서로 출력하게 되는거임.
포인터가 헷갈리기 쉬운게, *연산자 때문에 눈앞에는 p가 보이지만, 실제로 바뀌는건 p가 가리키는 다른 무언가 라는 점 때문에 가림막이 있는것처럼 행동해서 그럼. 그러니까 옆에 박스랑 화살표로 그림그려가면서 한번 따라가보셈
와 감사합니다 행님 ㅜㅜ 복 받으실 거에요