2014-10-02 4 views
2

다음 프로그램에서 여기 ptr 정수 포인터에 대한 포인터로 선언되었으며 정수 포인터의 배열로 선언 된 p[] 배열의 기본 주소가 할당되었습니다. ptr이 증가하고 ptr++ 다음에 ptr이 증가하기 전에 주소 9016 (p의 시작 주소가 9016이라고 가정)이 있다고 가정하면 값 9020이 포함됩니다 (int가 4 바이트를 차지한다고 가정).포인터 연산이 잘못 출력 됨

그래서 ptr-p은 출력을 4 (9020-9016 = 4)로 지정해야합니다. 그러나 출력은 1로 표시됩니다. 왜?

#include<stdio.h> 
int main() 
{ 
    static int a[]={0,1,2,3,4}; 
    static int *p[]={a,a+1,a+2,a+3,a+4}; 
    int **ptr=p; 
    ptr++; 
    printf("%d",ptr-p); 
    return 0; 
} 
+0

포인터를 정수 유형으로 개별적으로 캐스팅 한 다음 뺍니다. –

답변

8

한 포인터의 결과는 마이너스 또 다른 포인터가 요소 그들 사이의 바이트 수가 아닌 수입니다.

int **ptr=p; 
ptr++; 

ptr 전진 하나 개의 원소이므로 ptr - p1의 값을 갖는다.

BTW,이 동작은 예에서는 ptr = p + 1; 수단 ptr++ (과 일치한다. 동일한 기본 유형의 다른 포인터로부터 포인터

+0

감사합니다. @yu Hao thanki – Walter

2

감산 두 사이의 소자의 수를 의미하는 정수를 반환 포인터.

우리는 각각 다음 p2-p1는 (4 int 크기 때문에) 4를 제공 주소 1000 및 1016을 포함하는 2 개의 포인터 int 포인터 p1p2가있는 경우.

,
1

두 포인터의 차이점을 발견하면 두 포인터 사이의 개체 수를 얻습니다.

printf("%d",(char *)ptr-(char *)p); 

그것은 4 인쇄됩니다 : 당신은 당신이해야 할 바이트의 관점에서 가치를 알고 싶다면 객체로이 경우 는 올바르게 값 1

있어 정수 유형의이다.