포인터 연산(차이값)

rgbi3307의 이미지

	//char형을 가르키는 포인터의 차이값
	{
		char a[10];
		char *pa1, *pa2;
 
		pa1 = &a[0];
		pa2 = &a[10];
		printf("length1 = %d\n", pa2 - pa1);
	}
 
	//int형을 가르키는 포인터의 차이값
	{
		int a[10];
		int *pa1, *pa2;
 
		pa1 = &a[0];
		pa2 = &a[10];
		printf("length2 = %d\n", pa2 - pa1);
	}
 
	//double형을 가르키는 포인터의 차이값
	{
		double a[10];
		double *pa1, *pa2;
 
		pa1 = &a[0];
		pa2 = &a[10];
		printf("length3 = %d\n", pa2 - pa1);
	}

위의 코드에서 length1, 2, 3은 각각 얼마로 산출될까요?

kaeri17의 이미지

뭔가 당연한것 같아서 돌려봤는데 다 10 맞군요. 이건 표준에서 보장해 주는 사항일듯..

rgbi3307의 이미지

모두 10으로 나왔습니다.
포인터 연산은 주소가 떨어져 있는 단위(offset)로 계산되는 듯 하네요~

From:
*알지비 (메일: rgbi3307(at)nate.com)
*틈틈히 커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

체스맨의 이미지

배열과 포인터의 상관 관계
&a[n] == a+n

즉,
&a[n] - a == n

이기 때문에 당연한 결과입니다.

Orion Project : http://orionids.org

pchero의 이미지

코드 한번 실행해보고 그냥 그런가보다라고 생각했었는데..

이유없는 현상은 아무것도 없군요. 잠시 부끄러움을 느꼈습니다;;

깔끔한 정리와 간단한 설명 감사드립니다.

---------------------------------
제일 왼쪽이 저입니다 :)

---------------------------------
제일 왼쪽이 저입니다 :)

gloomyr의 이미지

int 경우
pa1 = 0x0012ff0c
pa2 = 0x0012ff34

실질적인 주소값의 차이는 28(40)..
pa2-pa1 = 10 ..

====체스맨=====
&a[n] == a+n

즉,
&a[n] - a == n
============= 명확하게 이해가 되지만..

pa2-pa1 = 10 왜 그렇지?? ㅋㅋ

pa2 - pa1 ==
0x0012ff34 - 0x0012ff0c 이렇게확장되는게 아니고
(a+10) - (a) 요렇게 확장되나보다..

하지만 그렇지만..
요녀석이 다시
(0x0012ff0c + 28) - (0x0012ff0c) 이렇게 확장이 되어서
결국 0x0012ff34 - 0x0012ff0c 요렇게 확장되어서 결과는 28(40) 이 나와야 하는게 아닌가??

거참.. ㅋㅋ

freestyle의 이미지

전웅님이 번역하신 'The C Programming Language 2nd. Appendix A' 문서의 주소입니다.
www.joinc.co.kr/download/doc/knr2rfm.pdf

' A7.7 덧셈연산자' 부분을 보시면 됩니다.

...
배열의 어떠한 대상체를 가르키는 포인터와 정수값 (integral) 은 더해질 수 있습니다 . 정수값 (integral) 은 포인터가 가르키는 대상체의 크기를 곱해서 메모리상의 주소 (address offset) 로 변환 됩니다. 연산의 결과인 합은 원래의 대상체로부터 적당한 상대번지 (offset) 만큼 떨어져있는, 같은 배열내의 다른 대상체를 가르키는 포인터 입니다.
...
포인터에서 어떤 정수값 (integral) 도 뺄 수 있으며 덧셈연산자처럼 동일한 변환이 적용 됩니다.
같은 데이터형 포인터는 서로 뺄 수 있으며, 결과는 두 대상체 사이의 거리 (변위, displacement) 를 나타내는 부호있는 정수값 (integral) 입니다
...

----------------------
Go to the U-City

----------------------------------------------------------------------------------------
Don't Feed the Trolls!
----------------------------------------------------------------------------------------

kaeri17의 이미지

(int*)a - (int*)b 와 (char*)a - (char*)b는 다릅니다. 바이트수가 아닌 그 형의 자료가 들어갈 수 있는 공간으로 정의를 해야 자연스러줘 지죠.

예를들어 int* 형에 대하여 a++이라는 연산을 하면 당연히 다음으로 저장할 곳을 가르켜야지 메모리를 안덮어쓰겠죠.

gloomyr의 이미지

그러니깐..
a+10 이 a에서 10번째 위치인놈인데..
결국은 offset + 위치 가되어서 값이
char 은 10 ..
int 는 40
double은 80..
요렇게 어느순간엔가 확장이 될텐데요.....

배열에서 a+10 해서 위치를 찾아갈때는 (a+28(40))요렇게 확장되어서 쓰엿을텐데

(a+10) - a 해서 10이나오니 변수의 값들이 확장 타입크기만큼으로 확장되기 전에
(a+10) -a 가 먼저 계산이 되고나서 나머지 값 으로 크리만큼 확장하나보군요.

그래서 10이 나올수 잇는거겟죠???