ptr이 임의의 배열을 가리키는 포인터이고 n이 정수일 때
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


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

결과를 보면 알 수 있듯이 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언어 공부중이다. ㅎㅎㅎ

+ Recent posts