2017-12-08 15 views
-4
#include<stdio.h> 
int main(){ 
    int a1[]={6,7,8,18,34,67}; 
    int a2[]={23,56,28,24}; 
    int a3[]={-12,27,-31}; 
    int *y[]={a1,a2,a3}; 
    int **a= y; 

    printf("%d\n",a[0][2]); 
    printf("%d\n",*a[2]); 
    printf("%d\n",*(++a[0])); 
    printf("%d\n",*(++a)[0]); 
    printf("%d\n",a[-1][1]); 
    return 0; 
} 

위의 코드 출력을 실행하면 8, -12,7,23,8입니다. 하지만 마지막 3 줄을C에서 포인터 배열의 음수 인덱스

printf("%d\n",*(++a[2])); 
printf("%d\n",*(++a)[1]); 
printf("%d\n",a[-1][1]); 

출력이 8, -12,27,27,7로 변경하면됩니다. 마지막 printf 문을 이해할 수 없습니다. [-1] [무언가]는 어떻게 계산됩니까? 그리고 내게 따르면 *(++a)[1]은 27 대신 56을 인쇄해야합니다!

+0

음수 인덱스에 대해서는 [C에서 음수 배열 인덱스를 사용할 수 있습니까?] (https://stackoverflow.com/questions/3473675/are-negative-array-indexes-allowed-in-c) – Galen

+1

'a' 배열이 아니므로 포인터입니다. 'a [-1]'은'* (a - 1)'과 동일합니다.'a'가 배열의 중간을 가리키면 괜찮습니다. 그리고 어제 우리는 [더욱 재미있는 예제가 있습니다] (https://stackoverflow.com/questions/47683569/can-someone-please-explain-me-this-pointer-c-code) –

+0

@Galen 이미 읽었습니다. 그것은 부정적인 인덱스가 배열에 다시있는 경우입니다. 그러나 나는 그것을 여기에 적용 할 수 없다. – Prakhar

답변

0

포인터 및 배열 기반은 사실 가상 메모리의 주소입니다. C에서는 새로운 주소로 계산할 수 있습니다. 컴파일러는 포인터가 가리키는 메모리 크기 (예 : int * 4 Bytes)를 알고 있으므로 포인터 +/- 1은 주소 +/- 크기 (예 : int의 경우 4 바이트)를 의미합니다.

연산자 *는 지정된 주소에 저장된 값을 가져 오는 것을 의미합니다.

또 다른 속임수는 연산자의 우선 순위입니다. []는 ++ 앞에 계산됩니다.

위의 내용을 이해하면 문제가 해결되어야합니다.