열혈강의c공부하다가 질문드립니다
(1)
*ptr 이 가리키는것이 33이 되었잖아요..
*ptr++ 를 하게 되면 원래 있던 *(ptr+1), *(ptr+2)는 어떻게 되나 궁금해서 직접 *(ptr+1)를 확인해봤는데 이상한 값이 나오네요...
왜 이런건가요??
(2)
배열의 이름은 포인터 상수라 주소값 변경이 불가능하다고 했는데
왜 여기서는 ptr++ 이 가능한가요..
ptr=arr이나 다름 없으니까 이렇게 되면 배열의 이름에 담긴 값이 변경 되는건데;;;
=======================
#include <stdio.h>
int main(void)
{
int arr[3]={11, 22, 33};
int*ptr=arr;
printf("%d %d %d n", *ptr, *(ptr+1), *(ptr+2));
printf("%d ", *ptr); ptr++;
printf("%d ", *ptr); ptr++;
printf("%d ", *ptr);
printf("%d", *(ptr+1));
return 0;
}
뭐라는거냐 진짜..
ptr은 배열이었던 적이 없다.
ptr이 33찍은 이후로 *( +1)넣으면 공허폭격기한테 처맞아서 공허로 돌아간다
1) 간단히 말하자면 포인터는 ++ 할때마다, 자기 타입의 크기만큼 건너뛴 주소를 가리킨다. 즉 ptr이 배열 첫번째를 가리키고 있었을때 ptr + 1이 가리키는 곳은 배열 두번째라는 소리. 위에 이상한값이 뜨는 이유는 배열 세번째, 배열 맨 마지막을 가리키고 있었는데 +1을 해줬기 때문에 배열 범위를 벗어난 부분을 가리키기 때문
2) ptr = ary는 ptr이 ary랑 같은놈이 된다는 뜻이 아니다. ary가 가리키던 주소 공간 값을 ptr에 \'복사\' 해서 저장했을 뿐이다. 그러니 prt은 배열이 아니라 단지 그 주소를 가리키는 포인터일 뿐이고, 당연히 ++이 된다.
물론 ary값은 변경 안되고 그대로 있다.
횰량//감사합니다. 그러면 ptr++을 해줄때마다 ptr+1, ptr+2들 역시 자기 타입의 크기만큼 건너뛴 주소들을 가리키게 되는건가요?
printf(\"%d \", *ptr); ptr++; printf(\"%d \", *ptr); printf(\"%d\", *(ptr+1));
위에서는 *(ptr+1) 이 33을 가리키네요 ㅎ
당연히 그렇게 되겠지 ++하면 ptr안에 있던 값이 그만큼 건너뛴 값으로 수정이 되었을 테니까 ptr + 1에도 영향이 가는건 당연하지
조언 감사합니다 ㅎㅎ
산연산 후연산 차이점 알아보긔 ㅋㅋㅋ