2017-12-08 1 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; 
} 

Wenn ich den obigen Code ausführen, ist Ausgabe 8, -12,7,23,8. Aber wenn ich die letzten 3 Zeilen zunegativer Index im Array von Zeigern in C

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

Ausgang ist 8, -12,27,27,7. Ich kann die letzte Printf-Anweisung nicht verstehen. Wie berechnet sich ein [-1] [etwas]? Und nach mir soll *(++a)[1] 56 statt 27 drucken!

+0

Bezüglich des negativen Index, siehe [Sind negative Array-Indizes in C erlaubt?] (Https://stackoverflow.com/questions/3473675/are-negative-array-indexes-allowed-in-c) – Galen

+1

'a' ist kein Array, es ist ein Zeiger. 'a [-1]' ist das gleiche wie '* (a - 1)' was in Ordnung ist, wenn 'a' in die Mitte eines Arrays zeigt. Und gestern hatten wir [noch lustigere Beispiele] (https://stackoverflow.com/questions/47683569/can-someone-please-explain-me-this-pointer-ccode) –

+0

@Galen Ich habe es schon gelesen. Es sagt, wenn der negative Index ist, gehen sie einfach zurück in das Array. Aber ich kann es hier nicht anwenden. – Prakhar

Antwort

0

Zeiger und Array-Basen sind tatsächlich Adressen im virtuellen Speicher. In C können sie in neue Adressen berechnet werden. Da der Compiler die Speichergröße kennt, auf die der Zeiger zeigt (z. B. zeigt int * auf 4 Bytes), bedeutet ein Zeiger +/- 1 die Adresse +/- die Größe (z. B. 4 Bytes für int).

Der Operator * bedeutet, dass der Wert in der angegebenen Adresse gespeichert wird.

Ein weiterer Trick hier ist die Prioritäten der Betreiber. [] wird vor ++ berechnet.

Wenn Sie verstehen, was ich oben meine, sollte Ihr Problem gelöst werden.