Frage zur richtigen Schreibweise bei Pointern
-
Hallo,
und zwar hab ich eine kleine Frage bezüglich dem richtigen (bzw. bevorzugten) ausgeben von Pointern auf ein Array.
Es gibt ja einige möglichkeiten den Pointer auszugeben aber gibt es auch eine bevorzugte. Hier mal meine drei Beispiele dazu:int arr_test[10]; printf("arr_test = %p\n", arr_test); printf("Pointer to arr_test[0] = %p\n", &arr_test[0]); printf("Pointer to arr_test = %p\n", &arr_test);
Vielen danke schonmal für die Antwort.
MfG
yahoo92
-
Die bevorzugte (weil kürzeste) Schreibweise ist die erste. Nur der Arrayname.
Die Zweite ist auch richtig. Adresse vom ersten Element.
Die Dritte geht bei Arrays. Bei Zeigern aber nicht. Darum wird sie nicht genommen.Für das Programm sollte es keinen Unterschied machen ob da
int arr_test[10]; //oder int *arr_test = malloc(10 * sizeof(int));
steht.
Und wenn das Array als Parameter einer Funktion definiert ist, ist es immer ein Zeiger.
-
Okay, danke für die Antwort
Also hab ich das dann richtig verstanden, dass manprintf("Pointer to arr_test = %p\n", &arr_test);
nicht verwendet weil es dann zu Missverständnissen bei Pointern komm wie z.B bei:
int arr_test[10]; int* p1 = arr_test; printf("Pointer to *p1 (arr_test[0]) = %p\n", p1); printf("Pointer to p1 = %p\n\n", &p1);
MfG
-
Ich würde die Gefahr eher so ausdrücken:
int arr[10]; int* ptr = arr; printf("Array ohne Adressoperator: %p\n", arr); printf("Array mit Adressoperator: %p\n", &arr); printf("Pointer auf Array ohne Adressoperator: %p\n", ptr); printf("Pointer auf Array mit Adressoperator: %p\n", &ptr);
Typische Ausgabe:
Array ohne Adressoperator: 0xbfc7e658 Array mit Adressoperator: 0xbfc7e658 Pointer auf Array ohne Adressoperator: 0xbfc7e658 Pointer auf Array mit Adressoperator: 0xbfc7e654
Der letzte ist also anders. Wenn wir nun nicht einfach nur den Zahlenwert der Pointer ausgegeben hätten, sondern das, auf was der Zeiger zeigt interpretierten (zum Beispiel Formatspezifizierer "%s"), dann würde der letzte Ausdruck ein falsches, undefiniertes Ergebnis geben. Das heißt, wenn man hier den Adressoperator benutzt, dann muss man genau wissen, dass man wirklich ein Array vorliegen hat (und auch keinen Zeiger, der wie ein Array aussieht! Zum Beispiel Funktionsparameter) und diese Tatsache darf sich im späteren Entwicklungsprozess auch nicht mehr ändern. Ohne Adressoperator ist hingegen egal, was der genaue Typ ist.
Weiterhin passen mit Adressoperator auch die Typen nicht. Beispiel:
char foo[6] = "Hallo"; char *bar = foo; foo; // Typ char* bar; // Typ char* &foo; // Typ char(*)[6] &bar; // Typ char** printf("%s", /* erwartet hier char* */ );
-
&arr_test
wird deswegen nicht verwendet, weil die Dereferenzierung eines Zeigers auf ein Array aus Elementen als Zeiger auf ein Arrayelement undefiniertes Verhalten bedeutet.
Die Zeiger sind inkompatibel, weil die basierenden Datentypen inkompatibel sind, dennint ist inkompatibel zu int [10]