3 Stimmen

C - (ptr = = &ptr) Was ist *ptr?

Dies mag eine dumme Frage sein, aber ich habe ein kleines Problem mit dem Verständnis von C Pointers. Noch mehr, wenn es um Arrays geht. Zum Beispiel:

char ptr[100];
ptr[0]=10;

fprintf(stderr, "&ptr: %p \n ptr: %p \n*ptr: %d\n", &ptr, ptr, *ptr);

if ( &ptr == ptr ) {
  fprintf(stderr, "Why?\n");
}

Wie ist das überhaupt möglich? 'ptr' steht an der Adresse &ptr. Und der Inhalt von ptr ist der gleiche wie &ptr. Warum ist dann *ptr = 10?

5voto

John Bode Punkte 112486

Die Adresse des ersten Elements des Arrays ist die gleiche wie die Adresse des Arrays selbst.

Es sei denn, es ist der Operand der Funktion sizeof oder Adresse von & Operatoren oder ein Stringliteral ist, das zur Initialisierung eines anderen Arrays in einer Deklaration verwendet wird, wird ein Ausdruck vom Typ "N-Element-Array von T" implizit in den Typ "Zeiger auf T" umgewandelt ("zerfallen") und der Wert ist die Adresse des ersten Elements im Array.

Wenn der Ausdruck a vom Typ "N-Element-Array von T" ist, dann ist der Ausdruck &a vom Typ "Zeiger auf N-Element-Array von T" ist, oder T (*)[N] .

Angesichts der Erklärung

T a[N];

dann sind die folgenden Punkte alle wahr:

Expression         Type        Decays to
----------         ----        ---------
         a         T \[N\]       T \*
        &a         T (\*)\[N\]    n/a
        \*a         T           n/a

Die Ausdrücke a y &a beide ergeben den gleichen Wert Wert (die Position des ersten Elements im Array), haben aber unterschiedliche Typen (Zeiger auf T bzw. Zeiger auf Array von T).

3voto

Matthew Flaschen Punkte 266507

ptr (das, wie sbi sagt, eigentlich ein Array ist) zerfällt in &(ptr[0]) ( char * zum ersten Element)

Dies ist die gleiche Adresse wie &ptr (a char (*) [] ), auch wenn es sich um unterschiedliche Typen handelt.

0voto

Muthuraman Punkte 143
    int arr[5];
    arr[0]= 7;

    fprintf(stdout,"%p %p %d",&arr[0],arr,*arr);

    if( (int)&arr == (int)arr ) printf("good\n");
    else printf("bad\n");
    return 0;

}

Dies wird funktionieren....

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X