ptr이 임의의 배열을 가리키는 포인터이고 n이 정수일 때
ptr[n] = *(ptr+n)
결과는 모두 같이 3이 나온다. 3번이 이해가 잘 안가지만 말이다. ㅡㅡㅋ
2[ar] 맨 위의 공식되로 변환하면 *(2+ar) 이 되고 *(ar+2) 교환 법칙에 의해서 동일하다고 한다.
흠 그럼 다 되는 것인가 2가 배열을 가지는 것도 아닌것이.. 문법이니 외우자 쩝
더 깊게 들어가보면 *(*(ar+2)+1)이 ar[2][1]과 같다는 것을 증명하는 예제이다.
결과
1번째 2번째는 결과가 같다는 것을 증명했다.
ar+2 이를 했을 경우 ar[2] 번지로 이동한다. 부분배열을 가르키는 포인터이다.
*(ar+2)가 되었을때 16비트가 되면서 부분 배열의 선두 번지 &ar[2][0]으로 평가된다.
*(ar+2)+1 포인터 상수에 정수를 더해서 ar[2][1] 포인터를 리턴한다.
*(*(ar+2)+1) ar[2][1]에 해당하는 값을 가져온다.
재미있는 것은 ar=*ar이 같은 주소를 가르키는 포인터이고 **ar 했을 경우 그 값을 가져온다는 것이다.
2차원 배열은 이중포인터라는 것,
즉 *(ar+2) *은 값을 나타내는 표시인데 *(ar+2)값이 포인터라는 것이다. 한차례 더 써줄 경우 거기에 있는 값을 가져올 것이다. 만약 *(*(ar+2))를 할 경우 9를 가져올 것이다.
그럼 1차원 배열을 보도록 하겠다.
결과
결과를 보면 알 수 있듯이 1차원에서는 *ar 값이 바로 값이 되는 경우이고 2차원일 경우 *ar이 포인터가 되는 경우이다.
연산 결과 *이 앞에 있으므로 첫번째는 바로 값으로 변환되고 ar의 경우 포인터 연상이 되어 2칸 이동하여 30의 결과를 가져온다.
어쩌면 포인터와 배열명은 같을 수도 있다.
결과는 1,2로 같다. 이제까지 잘 이해해 오다가 포인터에서 다시 막막하기 시작한다. 이번엔 정복해야 되는데.. 쩝
지금까지 한 것이 정답이 아닐수도 있다. 이건 내가 돌려보며 이해한것이니 혹시라도 다른 사람들이 보더라도 오해가 없기를
그리고 지적해주기 바란다. C언어 공부중이다. ㅎㅎㅎ
ptr[n] = *(ptr+n)
#include <Turboc.h> void main(void) { int ar[5]={1,2,3,4,5}; printf("ar[2]=%d\n", ar[2]); printf("ar[2]=%d\n", *(ar+2)); printf("ar[2]=%d\n", 2[ar]); }
결과는 모두 같이 3이 나온다. 3번이 이해가 잘 안가지만 말이다. ㅡㅡㅋ
2[ar] 맨 위의 공식되로 변환하면 *(2+ar) 이 되고 *(ar+2) 교환 법칙에 의해서 동일하다고 한다.
흠 그럼 다 되는 것인가 2가 배열을 가지는 것도 아닌것이.. 문법이니 외우자 쩝
더 깊게 들어가보면 *(*(ar+2)+1)이 ar[2][1]과 같다는 것을 증명하는 예제이다.
ar[0][[0] | ar[0][[1] | ar[0][[2] | ar[0][[3] |
ar[1][[0] | ar[1][[1] | ar[1][[2] | ar[1][[3] |
ar[2][[0] | ar[2][[1] | ar[2][[2] | ar[2][[3] |
#include <Turboc.h> void main(void) { int ar[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; printf("ar[2][1]=%d\n", ar[2][1]); printf("ar[2][1]=%d\n", *(*(ar+2) +1)); //부분 배열을 가르키는 포인터 printf("sizeof(ar+2)=%d\n", sizeof(ar+2)); //선두번지의 포인터 상수 즉 부분 배열이 된다. printf("sizeof(*(ar+2))=%d\n", sizeof(*(ar+2))); printf("sizeof(*(ar+2)+1)=%d\n", sizeof(*(ar+2)+1)); printf("ar[2][0]=%d\n", *(ar+2)); printf("ar=%d\n",ar); printf("*ar=%d\n",*ar); printf("**ar=%d\n",**ar); printf("ar[0][3]=%d\n", *(*ar + 1)); printf("sizeof(*(ar+2)+0)=%d\n", sizeof(*(ar+2)+0)); }
결과
ar[2][1]=10
ar[2][1]=10
sizeof(ar+2)=4
sizeof(*(ar+2))=16
sizeof(*(ar+2)+1)=4
ar[2][0]=1245012
ar=1244980
*ar=1244980
**ar=1
ar[0][3]=2
sizeof(*(ar+2)+0)=4
ar[2][1]=10
sizeof(ar+2)=4
sizeof(*(ar+2))=16
sizeof(*(ar+2)+1)=4
ar[2][0]=1245012
ar=1244980
*ar=1244980
**ar=1
ar[0][3]=2
sizeof(*(ar+2)+0)=4
1번째 2번째는 결과가 같다는 것을 증명했다.
ar+2 이를 했을 경우 ar[2] 번지로 이동한다. 부분배열을 가르키는 포인터이다.
*(ar+2)가 되었을때 16비트가 되면서 부분 배열의 선두 번지 &ar[2][0]으로 평가된다.
*(ar+2)+1 포인터 상수에 정수를 더해서 ar[2][1] 포인터를 리턴한다.
*(*(ar+2)+1) ar[2][1]에 해당하는 값을 가져온다.
재미있는 것은 ar=*ar이 같은 주소를 가르키는 포인터이고 **ar 했을 경우 그 값을 가져온다는 것이다.
2차원 배열은 이중포인터라는 것,
즉 *(ar+2) *은 값을 나타내는 표시인데 *(ar+2)값이 포인터라는 것이다. 한차례 더 써줄 경우 거기에 있는 값을 가져올 것이다. 만약 *(*(ar+2))를 할 경우 9를 가져올 것이다.
그럼 1차원 배열을 보도록 하겠다.
#include <Turboc.h> void main(void) { int ar[4]={10,20,30,40}; printf("%d\n", *ar+2); printf("%d\n", *(ar+2)); }
결과
12
30
30
결과를 보면 알 수 있듯이 1차원에서는 *ar 값이 바로 값이 되는 경우이고 2차원일 경우 *ar이 포인터가 되는 경우이다.
연산 결과 *이 앞에 있으므로 첫번째는 바로 값으로 변환되고 ar의 경우 포인터 연상이 되어 2칸 이동하여 30의 결과를 가져온다.
어쩌면 포인터와 배열명은 같을 수도 있다.
#include <Turboc.h> void main(void) { int arr[2] = {1,2}; int *pArr=arr; printf("%d, %d \n", arr[0], *(arr+1)); printf("%d, %d \n", pArr[0], *(pArr+1)); }
결과는 1,2로 같다. 이제까지 잘 이해해 오다가 포인터에서 다시 막막하기 시작한다. 이번엔 정복해야 되는데.. 쩝
지금까지 한 것이 정답이 아닐수도 있다. 이건 내가 돌려보며 이해한것이니 혹시라도 다른 사람들이 보더라도 오해가 없기를
그리고 지적해주기 바란다. C언어 공부중이다. ㅎㅎㅎ