Pointer und arrays



  • Es sind beides Zeiger auf eine Adresse und Arrays sind statisch, normale pointer hingegen dynamisch..

    und:
    das solltest du auf jeden fall noch ausführen, viel zu ungenau. da fehlt die fachlich korrekte erläuterung..
    und verwende am besten code-beispiele, an denen zu erkennen ist, das es unterschiede zwischen arrays und pointern gibt (bzw. die den eindruck erzäugen könnten, dass es sich dabei um das selbe handelt...)!



  • ein pointer ist die adresse einer adresse

    Wie? Das ist mir noch nicht klar.. Wie kann ich mir das vorstellen?

    verwende am besten code-beispiele, an denen zu erkennen ist, das es unterschiede zwischen arrays und pointern gibt

    hast du mal ein gutes beispiel parat??



  • GoddyXB schrieb:

    Wie? Das ist mir noch nicht klar.. Wie kann ich mir das vorstellen?

    Also pass auf: du haste eine pointervariable, deren Inhalt bzw. "Wert" ist eine Adresse, während hingegen z.B. der Inhalt einer Integer-Variablen ein Integer-Wert ist... Reicht dir das als Verständnis?

    GoddyXB schrieb:

    hast du mal ein gutes beispiel parat??

    hier:

    #include <stdio.h>
    
    int main(void)
    {
    	int n=3;
    	/* eindim. Array mit Platz für 5 Werte*/
    	int array[5]={ 1,2,3,4,5 };
    	/* int-Zeiger verweist jetzt auf array[0] */
    	int *ptr = array;
    
    	/* 4 Möglichkeiten, um auf das erste Element zuzugreifen */
    	printf("%d " ,*ptr);
    	printf("%d ",ptr[0]);
    	printf("%d ",*array);
    	printf("%d\n",array[0]);
    
    	/* 4 Möglichkeiten, um auf das n-te Element zuzugreifen */
    	printf("%d " ,*(ptr+n));
    	printf("%d ",ptr[n]);
    	printf("%d ",*(array+n));
    	printf("%d\n",array[n]);
    
    	/* 4 Möglichkeiten, um auf die Anfangsadresse zuzugreifen */
    	printf("%p " ,ptr);
    	printf("%p ",&ptr[0]);
    	printf("%p ",array);
    	printf("%p\n",&array[0]);
    
    	/* 4 Möglichkeiten, um auf die Adresse des n-ten Elements zuzugreifen */
    	printf("%p " ,ptr+n);
    	printf("%p ",&ptr[n]);
    	printf("%p ",array+n);
    	printf("%p\n",&array[n]);
    
    	return 0;
    }
    


  • GoddyXB schrieb:

    Erläutere Gemeinsamkeiten und Unterschiede von Arrays und Pointern in C..

    Der erste Teil ist einfach. Gemeinsamkeiten: ES GIBT KEINE. PUNKT. Bitte nicht protestieren, es wird alles klar werden.

    Es sind beides Zeiger auf eine Adresse und Arrays sind statisch, normale pointer hingegen dynamisch..

    Völlig flachs.

    Pointer sind Objekte, die eine Adresse beinhalten. Man sagt, ein Pointer zeigt auf ein anderes Objekt, und meint damit, er beinhaltet die Adresse dieses Objektes. Da C eine Sprache mit statischem Typsystem ist, gibt es für jeden Typ von Objekt einen zugeordneten Pointertyp. Also z.B. Pointer auf int, Pointer auf double, Pointer auf struct Foobar. Da Pointer selbst auch Objekte sind, gibt es dieser Logik zufolge auch Pointer auf Pointer. Z.B. Pointer auf Pointer auf int.

    Man kann mit Pointern auch rechnen. Wenn ein Pointer auf ein Objekt zeigt, und man inkrementiert ihn um 1, zeigt er danach auf das im Speicher folgende Objekt. Entsprechendes gilt für die Dekrementierung.

    Arrays dagegen sind zusammengesetzte Objekte. Sie bestehen aus einer Anzahl N von Objekten des gleichen Typs, die im Speicher hintereinander liegen. Auch hier gilt wieder, dass man aus jedem Datentyp Arrays herstellen kann. So kann es auch Arrays geben, die wiederum Arrays enthalten (das nennt man gerne auch mehrdimensionales Array, aber dieser Begriff dient nur der Anschauung, es gibt in C keine weitergehende Unterstützung dafür). Es kann auch Arrays geben, die Pointer enthalten. Wie arbeitet man jetzt mit Arrays?

    Hier kommen jetzt wieder Pointer ins Spiel. Mit Arrays arbeiten kann man nämlich gar nicht direkt, zumindest kann man nicht besonders viel mit ihnen anfangen. Man kann nur über sizeof ihre Größe erfahren. In jedem anderen Kontext wird das Array zunächst automatisch in einen temporären Pointer auf das erste Element umgewandelt. Das erstmal sacken lassen.

    Alles weitere geschieht dann über diesen Pointer. Auch der Indexzugriff, den viele anfangs als das Charakteristikum eines Arrays schlechthin ansehen. A[B] ist schlicht und einfach genau das gleiche wie *(A+B) -- siehe oben, rechnen mit Pointern. D.h. das Array A wird in einen temporären Zeiger auf das erste Element umgewandelt, darauf wird B addiert (d.h. der Ergebnispointer zeigt B Elemente weiter im Speicher, nämlich auf das (B+1)-te Element), dann wird dereferenziert. (Ein interessanter Fakt am Rande ist dabei, dass + bekanntlich kommutativ ist, d.h. dass man statt *(A+B) auch *(B+A) schreiben kann. C ist insofern konsequent, als dass folglich auch B[A] erlaubt ist und das gleiche ergibt wie A[B].)

    Es ist also nicht so, dass Pointer und Arrays sich ähneln. Arrays verwandeln sich nur bei jeder Gelegenheit in temporäre Pointer, und damit arbeitet man dann.

    Man kann das sicher noch verfeinern und auf die Begriffe LValue und RValue eingehen, aber dazu hatte ich jetzt keine Lust 🙂



  • GoddyXB schrieb:

    Es sind beides Zeiger auf eine Adresse und Arrays sind statisch, normale pointer hingegen dynamisch..

    Wie Bashar es schon etwas manierlicher ausgedrückt hat, selten so viel Quatsch in einem so kurzen Satz gehört. Nicht böse sein.
    Zeiger sind, genauso wie Arrays erstmal statisch, der Standard spricht hier von "automatisch". Auf was ein Zeiger dann zeigt, ist dem Anwender überlassen, und das muss nicht immer etwas gültiges sein. Deshalb haben viele Leute auch so ihre Probleme damit. Du gehst aber zumindest insofern in die richtige Richtung, dass Zeiger auch dafür benutzt werden, um dynamischen Speicher zu reservieren.
    Arrays sind hingegen erstmal überhaupt keine Zeiger, auch ist der Name kein Zeiger auf das erste Element oder sonst irgendwas. Wie Bashar aber bereits sagte, wird ein Array des Typs T[N] bei Bedarf nach T* umgewandelt.



  • groovemaster schrieb:

    Arrays sind hingegen erstmal überhaupt keine Zeiger, auch ist der Name kein Zeiger auf das erste Element oder sonst irgendwas.

    Wieso nicht? Genug Tutorials u.ä. im Netz behaupten das zumindest, genau wie mein Lehrer.

    z.B. http://wwwlrh.fh-bielefeld.de/IN_Prak/inprak10.htm

    Ober habe ich da was ganz falsch verstanden?!



  • hatte ich nich schon mal gemeint...ein text über Pointer usw. gehört in die FAQ? 😉

    Bashar
    ******

    hälst grad einen C Kurs? *grins*

    Helmut
    ******

    Tja dann machen sie halt auch mal Fehler.

    bye

    tt



  • Helmut` schrieb:

    groovemaster schrieb:

    Arrays sind hingegen erstmal überhaupt keine Zeiger, auch ist der Name kein Zeiger auf das erste Element oder sonst irgendwas.

    Wieso nicht? Genug Tutorials u.ä. im Netz behaupten das zumindest, genau wie mein Lehrer.

    z.B. http://wwwlrh.fh-bielefeld.de/IN_Prak/inprak10.htm

    Ober habe ich da was ganz falsch verstanden?!

    Nee, hast du nicht. Die schreiben das tatsächlich. Es ist aber schlicht und einfach falsch. Arrays sind nunmal Arrays. Punkt. Eine Umwandlung in einen Zeiger kann jedoch vom Compiler implizit vorgenommen werden, was aber erst bei Bedarf passiert. Warum die Behauptung auf der Seite von dir falsch ist, kannst du selber schnell nachprüfen

    char s[100];
    size_t n = sizeof(s);
    

    Was würde n für einen Wert haben, wenn s ein Zeiger wäre? Was hat n tatsächlich für einen Wert?



  • folgendes programm zeigt, warum arrays KEINE pointer sind:

    #include <stdio.h>
    #include <malloc.h>
    
    int main(){
      int a[10];
      int *pa=(int*) malloc(10*sizeof(int));
      printf("%p\n",a);
      printf("%p\n",&a); //eigentlich quatsch, siehe beschreibung von bashar
      printf("%p\n",pa);
      printf("%p\n",&pa);
    }
    


  • TheTester schrieb:

    Bashar
    ******

    hälst grad einen C Kurs? *grins*

    Ne sowas mach ich nicht. Ich hatte nur grad Lust, das zu schreiben 🙂


Anmelden zum Antworten