Wie versteht man Zeigerarithmetik??
-
Ja, die Adressen sind gleich, aber der Typ hinter der Adresse ist jeweils ein anderer.
Darüber muss ich einen Moment nachdenken.
Wo du jetzt mit Begrifflichkeiten durcheinander kommst, verstehe ich nicht?
Die Adresse einer Klasse und die Adresse des in der Klassendefinition als erstes deklarierten Members ist die gleiche. Oder wie siehst du das?
Ich denke bei dem Begriff "Adresse" eben nur an eine Ganzzahl, nicht an einen Zeiger
-
Sone schrieb:
Ja, die Adressen sind gleich, aber der Typ hinter der Adresse ist jeweils ein anderer.
Darüber muss ich einen Moment nachdenken.
Ok.
Nein. Es gibt keinen Typ hinter der Adresse. Die Adresse ist einfach eine Ganzzahl, und das was irgendwo im Speicher liegt und diese Adresse hat ist ein Byte.
Wir können diese Bytes, die ab dieser Adresse im Speicher liegen, aber interpretieren - und zwar wie einen integralen Skalar der 4 Byte groß ist, usw.
Aber wir können nicht anhand einer Adresse darauf schließen. Gar nicht. Dazu brauchen wir einen Zeiger.Und ich unterscheide klar zwischen Zeiger und Adresse.
Zeiger:int *ptr;Adresse: 0xff64648 (oder irgendwas)
-
Sone schrieb:
Sone schrieb:
Ja, die Adressen sind gleich, aber der Typ hinter der Adresse ist jeweils ein anderer.
Darüber muss ich einen Moment nachdenken.
Ok.
Nein. Es gibt keinen Typ hinter der Adresse. Die Adresse ist einfach eine Ganzzahl, und das was irgendwo im Speicher liegt und diese Adresse hat ist ein Byte.
Sagen wir ganz einfach:
Der Typ des Ausdrucksar bzw. &ar[0]und&arist nicht derselbe.
Das ist doch die Kernaussage der ganzen Diskussion hier. Ich denke, mit diesem Satz bist du einverstanden.Sone schrieb:
Aber wir können nicht anhand einer Adresse darauf schließen. Gar nicht.
Ja stimmt, sieht man nur die Adresse, kann man nicht sagen, welcher Typ sich dahinter verbirgt.
PS: Gut dass du das mit der Klasse etc. wieder rausgenommen hast. :p
-
Totale Verwirrung schrieb:
Bashar schrieb:
Das "braucht" man für mehrdimensionale Arrays, die ja nichts anderes als Arrays mit wiederum Arrays als Elementen sind.
Also ich brauch's nicht, guckst du hier:
Deswegen hab ich das "braucht" in Anführungsstrichen gesetzt. Du siehst das vielleicht nicht, aber der Compiler braucht es hinter den Kulissen.
int m[2][4] = { {11, 12, 13, 14}, {21, 22, 23, 24} }; std::cout << m[i][j] << ' ';Das heißt nämlich nichts anderes als
*(*(m+i) + j)und das funktioniert genau deshalb, weil der zwischendurch auftauchende Zeiger m+i den Typ int(*)[4] hat.
-
out schrieb:
Sone schrieb:
Sone schrieb:
Ja, die Adressen sind gleich, aber der Typ hinter der Adresse ist jeweils ein anderer.
Darüber muss ich einen Moment nachdenken.
Ok.
Nein. Es gibt keinen Typ hinter der Adresse. Die Adresse ist einfach eine Ganzzahl, und das was irgendwo im Speicher liegt und diese Adresse hat ist ein Byte.
Sagen wir ganz einfach:
Der Typ des Ausdrucksar bzw. &ar[0]und&arist nicht derselbe.
Das ist doch die Kernaussage der ganzen Diskussion hier. Ich denke, mit diesem Satz bist du einverstanden.Das ist korrekt. Das würde ich auch so sagen. :xmas1:

out schrieb:
Sone schrieb:
Aber wir können nicht anhand einer Adresse darauf schließen. Gar nicht.
Ja stimmt, sieht man nur die Adresse, kann man nicht sagen, welcher Typ sich dahinter verbirgt.
PS: Gut dass du das mit der Klasse etc. wieder rausgenommen hast. :p
:xmas1: :xmas2:
-
Und ich unterscheide klar zwischen Zeiger und Adresse.
Also eine typbehaftete Adresse ist ein Zeiger? Aber alle Werte in C++ sind abgelgt in typbehafteten Variablen. Jeder Wert hat einen Typ. D.h. jede Adresse ist ein Zeiger.
-
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.
Z.B. diejenigen, die um < sizeof(Datentyp) Bits verschoben sind.Wenn *ptr z.B. auf 0x28fe97
dann könnte 0x28fe97 zwar ein Zeiger sein,
aber 0x28fe97+1 ist es definitiv nicht mehr.
-
knivil schrieb:
Und ich unterscheide klar zwischen Zeiger und Adresse.
Also eine typbehaftete Adresse ist ein Zeiger?
Wie kommst du darauf? Das habe ich nie so gesagt.
Ich definiere Zeiger in C++ so wie der C++-Standard.Aber alle Werte in C++ sind abgel[e]gt in typbehafteten Variablen.
Edit: Ich bestätige das jetzt nicht, weil ich über die Richtigkeit dieser Aussage noch nachdenken möchte, aber lassen wir das mal außen vor.
Jeder Wert hat einen Typ.
s. o., irrelevant.
D.h. jede Adresse ist ein Zeiger.
Nein; der Begriff Adresse ist nicht auf C++ beschränkt, und so nutze ich ihn auch nicht.
-
Sone schrieb:
Wie zum Teufel kommst du darauf? Das habe ich nie so gesagt.
Das ist die logische Konsequenz.
Ich definiere Zeiger in C++ so wie der C++-Standard.
Sind wir schon soweit, dass wir den Begriff im Standard nachschlagen muessen, damit wir eine gemeinsame Grundlage haben?
der Begriff Adresse ist nicht auf C++ beschränkt, und so nutze ich ihn auch nicht.
Mein Finger zeigt manchmal auf Dinge, manchmal popelt er auch in meiner Nase. Manchmal ist er ein Zeiger, manchmal nicht. Entweder wir sind bei C++ oder nicht. Hier gehts um C++ und mein Finger ist fehl am Platz. D.h. ich beschraenke mich auf C++.
-
Sone schrieb:
out schrieb:
Sone schrieb:
&array[0]und&arrayist 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.
&arrayist 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.htmlDa 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.