Wie versteht man Zeigerarithmetik??



  • Sone schrieb:

    out schrieb:

    Sone schrieb:

    &array[0] und &array ist ganz genau dasselbe.
    Wo soll da der Unterschied sein?

    Was redest du den da wieder?
    &array[0] ist die Adresse des ersten Element des Arrays.
    &array ist die Adresse des Arrays.

    Die Adressen sind gleich.

    Totaler Schwachsinn.
    Wenn dein Compiler in dem Beispiel gleiche Adresswerte anzeigt, heißt das noch lange nicht, dass das so sein muss. Der C-Standard garantiert das eben gerade explizit nicht, hier spielt nämlich das Alignment eine Rolle.
    Das kann man natürlich nicht wissen, wenn man so wie du den Standard nicht gelesen und verinnerlicht hat, trotzdem aber hier sein zusammengegoogeltes Halbwissen hinausposaunt.
    Zitat verstorbener P.Struck:
    "Wenn man keine Ahnung hat, einfach mal die Klappe halten."



  • Wutz schrieb:

    Zitat verstorbener P.Struck:
    "Wenn man keine Ahnung hat, einfach mal die Klappe halten."

    Ist das wirklich von P.Struck?



  • knivil schrieb:

    Jeder Wert hat einen Typ.

    Das würde ich anders formulieren: Jedes Objekt bzw. Ausdruck besitzt einen Typ und Wert.

    knivil schrieb:

    D.h. jede Adresse ist ein Zeiger.

    Kann ich mich anschließen denn:
    The result ot the unary & (address of) operator is a pointer to the object or function designated by its operand.



  • Programmierfachprofi schrieb:

    knivil schrieb:

    Jeder Wert hat einen Typ. D.h. jede Adresse ist ein Zeiger.

    Das ist falsch.

    Es gibt auch Adressen, die kein Zeiger sind.

    Schwachsinn, s.o..



  • Zitatfrage schrieb:

    Wutz schrieb:

    Zitat verstorbener P.Struck:
    "Wenn man keine Ahnung hat, einfach mal die Klappe halten."

    Ist das wirklich von P.Struck?

    Ich glaube schon:
    http://www.spiegel.de/politik/deutschland/peter-struck-die-praegnantesten-zitate-a-873892.html



  • Wutz schrieb:

    Zitatfrage schrieb:

    Wutz schrieb:

    Zitat verstorbener P.Struck:
    "Wenn man keine Ahnung hat, einfach mal die Klappe halten."

    Ist das wirklich von P.Struck?

    Ich glaube schon:
    http://www.spiegel.de/politik/deutschland/peter-struck-die-praegnantesten-zitate-a-873892.html

    Da steht aber ein Datum:

    SPD-Fraktionschef Peter Struck 2007 über die Debatten in seiner Fraktion

    "Wenn man keine Ahnung hat, einfach mal die Klappe halten."

    Ich habe den Spruch aber schon vor 2007 gehört.



  • Da der Thread sowieso aus dem Ruder gelaufen ist: Einfach mal die Kresse halten 😃

    Wahnsinn, was geht denn hier ab - und ich les' mir nach Feierabend auch noch 10 Seiten durch 😮



  • Bevor es untergeht:

    Die Adresse einer Klasse und die Adresse des in der Klassendefinition als erstes deklarierten Members ist die gleiche. Oder wie siehst du das?

    Das ist falsch, da jeder Kompiler beispielsweise den Zeiger auf die virtuelle Methodentabelle anders im Speicherbereich ablegen kann.



  • Tobiking2 schrieb:

    Ein Beispiel für Zeigerarathmetik wäre

    int a = 5;
    int *pa=&a;
    pa = pa+4; // Setzt pa auf pa + ( 4 * sizeof(int) )
    

    Um zum Thema zurück zu kommen.

    Um was geht es bei der Anweisung

    pa = pa + 4;
    

    Kann mir jemand in einem Satz sagen, auf was sich die 4 bezieht? Auf die Adresse, auf die der Zeiger pa zeigt?

    Mehr wollte ich eigentlich nicht wissen... Vielleicht ist das im Laufe des Threads untergegangen...



  • silent_max schrieb:

    Um was geht es bei der Anweisung

    pa = pa + 4;
    

    Kann mir jemand in einem Satz sagen, auf was sich die 4 bezieht? Auf die Adresse, auf die der Zeiger pa zeigt?

    Mehr wollte ich eigentlich nicht wissen... Vielleicht ist das im Laufe des Threads untergegangen...

    <seufz> 🙄

    Vereinfacht gesagt ist das das gleiche wie:

    7 = 3 + 4;

    Fazit:
    Auch mit Zeigern kann man rechnen.



  • Um mal wieder zum Array zu kommen:

    int a[5] = {11,22,33,44,55};
    int *pa=a; // Beim Array ohne &
    pa = pa+4;
    

    Dann zeigt pa jetzt auf das Element 4 vom Array a. Das mit der 55 drin.



  • Programmierfachprofi schrieb:

    Fazit:
    Auch mit Zeigern kann man rechnen.

    Du kannst aber nicht zwei Zeiger addieren, weil das keinen Sinn ergibt.
    Und es ist auch nicht das Gleich, da der Compiler noch die Größe des Datentyps beachtet.



  • DirkB schrieb:

    Um mal wieder zum Array zu kommen:

    int a[5] = {11,22,33,44,55};
    int *pa=a; // Beim Array ohne &
    pa = pa+4;
    

    Dann zeigt pa jetzt auf das Element 4 vom Array a. Das mit der 55 drin.

    Und wie kann ich auf die Adressen der restlichen Arrayelemente ermitteln?



  • In dem Beispiel ist das jetzt blöd, weil du pa schon verändert hast.
    Da kommt man dann durcheinander.

    Darum:

    int a[5] = {11,22,33,44,55};
    int *pa=a; // Beim Array ohne &
    int i=0;
    

    pa + 1 ergibt die Adresse von a[1];
    pa + 2 ergibt die Adresse von a[2];
    pa + 3 ergibt die Adresse von a[3];

    pa + i ergibt die Adresse von a[i];

    An den Inhalt kommst du mit dem Dereferenzierungsoperator *
    Und *(pa+i) ist das Gleiche wie pa[i]



  • DirkB schrieb:

    pa + 1 ergibt die Adresse von a[1];
    pa + 2 ergibt die Adresse von a[2];
    pa + 3 ergibt die Adresse von a[3];

    Verstehe ich das jetzt richtig:
    pa + 0 ergibt die Adresse von a[0]



  • silent_max schrieb:

    DirkB schrieb:

    pa + 1 ergibt die Adresse von a[1];
    pa + 2 ergibt die Adresse von a[2];
    pa + 3 ergibt die Adresse von a[3];

    Verstehe ich das jetzt richtig:
    pa + 0 ergibt die Adresse von a[0]

    Ja.

    Und
    pa+N ergibt die Adresse von a[N]

    uU ist da ein Muster ersichtlich.



  • Das kannst auch mit a selber machen:
    *(a+i) ist das Gleiche wie a[i]

    Ein Unterschied zwischen a und pa ist, dass du pa ändern kannst, a aber nicht.

    pa = a + 3; //ist ok
    a  = a + 3; //geht nicht.
    


  • Und darum ging es mir die ganze Zeit während des ganzen Threads.



  • Und das wurde dir eigentlich auch schon ganz oft erklärt.



  • DirkB schrieb:

    Und das wurde dir eigentlich auch schon ganz oft erklärt.

    Und erst jetzt habe ich es kapiert.


Anmelden zum Antworten