Zeiger
-
Hallo,
Also Zeiger sind ja normalerweise :
Variablen , die als Zeiger deklariert sind und als Wert die Speicheradresse einer anderen Variable besitzen. Damit zeigen sie auf die S.adresse && damit auf die var.Nun aber z. B:
int function(int *); .... int main(void) { int izahl1 = 10; function(&izahl1); .... }
function(&izahl1); --> Hier wird ein ganz normaler Wert / eine Speicheradresse in den Stack gelegt. Wie kann den ein ganz normaler Wert ein Zeiger sein? Es ist doch nur ein Wert...
-
Nein, hier wird die Adresse der (sprich: ein Zeiger auf die) Variable an die Funktion übergeben. Der "ganz normale" Wert wird ohne den Adressoperator & formuliert.
BTW: Hast Du diese Frage nicht schonmal exakt so gestellt?!
-
ja, sieht wie ein DUP von diesem Thread zu sein.
-
Was ich nicht verstehe ist folgendes :
Auch die Speicheradresse ist ein Wert ( 0xFDSDF... ) das auf den Stack gelegt wird ---> Was ist ein Zeiger ? Ein Zeiger ist doch :
Eine als Zeiger deklarierte var, die eine S.adresse als Wert besitzt.
---> Wie kann denn eine Speicheradresse , was eine Adresse ist ein Zeiger sein?? Wieso ist es ein Zeiger?
-
"Zeiger" ist nur eine kürzere Bezeichnung für "Variable, die eine Speicheradresse enthält". Mit dem Adress-Operator & kannst du die Speicheradresse ermitteln, an der eine gegebene Variable (izahl) liegt - und die kannst du dann als Zeiger weiterreichen.
-
dosomething schrieb:
Auch die Speicheradresse ist ein Wert ( 0xFDSDF... ) das auf den Stack gelegt wird
dosomething schrieb:
Eine als Zeiger deklarierte var, die eine S.adresse als Wert besitzt.
Genau, du hast es im Grunde selbst erklärt: Ein Zeiger ist eine Variable, deren Wert eine Adresse ist. Eine Adresse ist ein Wert, den Du in einer Zeigervariable speichern kannst.
-
CStoll schrieb:
"Zeiger" ist nur eine kürzere Bezeichnung für "Variable, die eine Speicheradresse enthält". Mit dem Adress-Operator & kannst du die Speicheradresse ermitteln, an der eine gegebene Variable (izahl) liegt - und die kannst du dann als Zeiger weiterreichen.
Also wir sind uns einig : Zeiger = var... Mit "&ivar" legen wir nur die Speicheradresse ( Adresse ) in den Stack . In der Funktionsdeklaration heißt es aber :
int function(int *);
Das ein Zeiger übergeben wird. Wieso ist auf einmal eine norm. Adresse ein Zeiger??
-
Du kannst an einen Parameter alles übergeben, was er an Daten schluckt - an einen Zeiger-Parameter halt die Adresse einer Variable (solange der Typ passt). Das funktioniert genauso, wie du eine "void test(int);" per "test(0x0815);" aufrufen kannst - der Parameter (hier eine Ganzzahl, oben ein Zeiger) wird mit dem übergebenen Wert (Ganzzahlkonstante bzw. Variablen-Adresse) gefüllt, bevor die Funktion ihre Arbeit aufnimmt.
-
dosomething schrieb:
Wieso ist auf einmal eine norm. Adresse ein Zeiger??
int function(int a); .... int main(void) { function(10); .... }
wieso ist ein normaler wert eine variable, bzw. eine variable ein normaler wert ?
-
dosomething schrieb:
Wieso ist auf einmal eine norm. Adresse ein Zeiger??
Eine Adresse ist immer ein Zeiger. Nicht "auf einmal". Genauer: Der Typ einer Adresse (&variable) ist immer "Zeiger auf Typ von 'variable'".
-
LordJaxom schrieb:
dosomething schrieb:
Wieso ist auf einmal eine norm. Adresse ein Zeiger??
Eine Adresse ist immer ein Zeiger.
nein, eine adresse ist eine eindeutige 'nummer' für einen speicherplatz. ein zeiger ist eine variable, die eine adresse speichern kann/soll.
-
zeigefinger-fan schrieb:
nein, eine adresse ist eine eindeutige 'nummer' für einen speicherplatz. ein zeiger ist eine variable, die eine adresse speichern kann/soll.
LordJaxom schrieb:
Genauer: Der Typ einer Adresse (&variable) ist immer "Zeiger auf Typ von 'variable'".
-
LordJaxom schrieb:
LordJaxom schrieb:
Genauer: Der Typ einer Adresse (&variable) ist immer "Zeiger auf Typ von 'variable'".
das ist ja noch verkehrter.
-
Wenn du nichts konstruktives beitragen kannst, dann sei lieber ruhig
(und anstelle eines einfachen "das ist noch verkehrter" solltest du uns lieber erklären, wie es richtig ist - aber das kann man ja von unser aller Lieblings-*** nicht erwarten)
-
CStoll schrieb:
aber das kann man ja von unser aller Lieblings-*** nicht erwarten)
die antwort will dir dein lieblingstroll nicht schuldig bleiben. der satz: Der Typ einer Adresse (&variable) ist immer "Zeiger auf Typ von 'variable'". zeigt deutlich, dass selbst user mit über 1000 beiträgen lückenhaftes grundlagenwissen haben oder vielleicht mal den dealer wechseln sollten.
Der Typ einer Adresse (&variable)...
die adresse hat keinen typ, sondern die variable hat einen typ. bei der zuweisung der adresse einer variablen an einen pointer z.b. *int a; int p=&a; beachtet der compiler, dass typ der variablen und typ des pointers kompatibel sind. eine adresse allein ist nur eine nummer....ist immer "Zeiger auf Typ von 'variable'".
eine adresse ist kein zeiger (das schrieb ich bereits) und weder zeiger noch adresse zeigen auf 'typ von variable', sondern auf 'variable vom typ int o.ä.'. auf einen typen kann man nicht zeigen (höchstens mit dem finger, weil er solchen blödsinn schreibt).
-
pedantic-freak schrieb:
Der Typ einer Adresse (&variable)...
die adresse hat keinen typ, sondern die variable hat einen typ. bei der zuweisung der adresse einer variablen an einen pointer z.b. *int a; int p=&a; beachtet der compiler, dass typ der variablen und typ des pointers kompatibel sind. eine adresse allein ist nur eine nummer.Jeder Wert hat einen Typ, nicht nur namentlich benannte Variablen (das schließt auch Literale wie 123 (Typ: int) oder 3.14 (Typ: double) und temporäre Werte wie den Rückgabewert des Adressoperators &ival (Typ: int* - Zeiger auf int) mit ein).
...ist immer "Zeiger auf Typ von 'variable'".
eine adresse ist kein zeiger (das schrieb ich bereits) und weder zeiger noch adresse zeigen auf 'typ von variable', sondern auf 'variable vom typ int o.ä.'. auf einen typen kann man nicht zeigen (höchstens mit dem finger, weil er solchen blödsinn schreibt).
Eine Adresse ist ein Wert - und hat als solche auch einen eigenen Typ, nämlich "Zeiger auf typ_x" (wobei typ_x der Typ der Variable ist, deren Adresse du genommen hast).
PS: Wer hier "den Dealer wechseln sollte", bleibt abzuwarten.
-
Dass er nicht sonderlich viel Ahnung von dieser Materie hat, weiss man (ich zumindest) seit dem Thread: http://www.c-plusplus.net/forum/viewtopic-var-t-is-198663-and-start-is-0.html
-
pedantic-freak schrieb:
eine adresse ist kein zeiger (das schrieb ich bereits) und weder zeiger noch adresse zeigen auf 'typ von variable', sondern auf 'variable vom typ int o.ä.'. auf einen typen kann man nicht zeigen (höchstens mit dem finger, weil er solchen blödsinn schreibt).
Es zeigt auch nichts auf einen Typ, es war "Zeiger auf <den Typ von 'variable' (aus dem Beispiel) bitte an dieser Stelle im Text einsetzen, danke>" gemeint. Ich habe anscheinend für Dich nur zuwenige Zitat- und Klammersymbole verwendet.
Dennoch brauchst Du trotz aller Differenzen und Nickeligkeiten nicht beleidigend, ausfallend oder verleumdend werden.
-
CStoll schrieb:
Eine Adresse ist ein Wert - und hat als solche auch einen eigenen Typ, nämlich "Zeiger auf typ_x" (wobei typ_x der Typ der Variable ist, deren Adresse du genommen hast).
nein, eine nackte adresse hat bestenfalls den typ 'vorzeichenlose ganzzahl' und ist erstmal kein zeiger. beispiel:
int *p = (int*)0x1234;
rechts der wert 0x1234 ist eine 'adresse', es ist kein pointer. durch den cast wird dem compiler gesagt, dass diese zahl die adresse von einem 'int' ist, und deshalb erlaubt er die zuweisung an den pointer.
oder sowas:int a = *(int*)0x1234;
hierbei wird die adresse als 'int*' interpretiert, damit ein 'int'-wert ausgelesen werden kann, ganz ohne einen pointer.
-
Tim schrieb:
Dass er nicht sonderlich viel Ahnung von dieser Materie hat, weiss man (ich zumindest) seit dem Thread:
hast du nicht gelesen (mein letzter beitrag in diesem thread), dass ich dich missverstanden hatte?
-
addressdecoder-freak schrieb:
nein, eine nackte adresse hat bestenfalls den typ 'vorzeichenlose ganzzahl' und ist erstmal kein zeiger. beispiel:
int *p = (int*)0x1234;
rechts der wert 0x1234 ist eine 'adresse', es ist kein pointer. durch den cast wird dem compiler gesagt, dass diese zahl die adresse von einem 'int' ist, und deshalb erlaubt er die zuweisung an den pointer.
Nein, der Wert 0x1234 ist (aus Sicht des Compilers und C-Programmierers - für Assembler-Programmierer sieht das vermutlich etwas anders aus) keine Adresse, sondern eine Zahl (Typ: int). Erst durch den Cast erklärst du dem Compiler, daß du diese Zahl gerne als Adresse verwenden willst.
Ja, ich weiß, für den PC sind das alles nur noch Bits und Bytes, aber auf dieser Ebene existieren auch keine "Typen" mehr - der Compiler steht eine Ebene weiter oben und kennt noch den Unterschied zwischen einem Zeiger und einer Zahl (zumindest solange, wie du ihm nicht mit expliziten Casts das Gegenteil erklären willst).