Pointer spielerei
-
*a zeigt ja dann auf *b
Somit endet es in einer Endlosschleife.
Nicht ganz, der Stelle, an die a zeigt wird der Wert der Stelle an die b zeigt zugewiesen und es wird bei der Zuweisung normalerweise eine Referenz auf this zurückgegeben bzw. im Falle von char wird hier einfach *a zurückgegeben. Es endet also in einer Endlosschleife, wenn weder a noch b auf 0 zeigen.
Wenn du willst, dass *a auf b zeigt musst du a = b schreiben. Dann zeigt a auf dieselbe Stelle im Speicher wie b.a zeigt auf den Nullpointer seiner eigenen Variable b ebenso.
Ne, a und b werden jeweils solange inkrementiert, bis die Zuweisung 0 zurückgibt und währenddessen werden alle Werte von *a zu *b kopiert.
Du hast eine falsche Einbildung von dem Dereferenzierungsoperator. Mit diesem (dem
greifst du auf den Wert zu, der in an der Stelle im Speicher steht, auf die der Zeiger selbst zeigt. *a = 'a'; weist also der Stelle im Speicher, auf die der Zeiger a zeigt den wert 'a' zu.
-
out schrieb:
Der Zeiger untersucher! schrieb:
void blup(char *a, char *b) { while ( *a = *b ); }*a zeigt ja dann auf *b
Somit endet es in einer Endlosschleife.
Eventuell. Erstmal ist a der Zeiger, und nicht *a. Zweitens könnte in *b der Wert 0 stehen, sodass die Schleife abbricht.
Ich hoffe ich störe nicht mit einer Zwischenfrage :).
"=" ist ja eine Zuweisung. Die ist ja immer true oder nicht ? Oder warum bricht da was ab ?
Oder fliegt dann eine Exception ? Wegen Null-Pointer ?
-
martin_zi schrieb:
"=" ist ja eine Zuweisung. Die ist ja immer true oder nicht ? Oder warum bricht da was ab ?
Der Wert einer Zuweisung ist der Wert der zugewiesen wird. a = 0 ist z.B. 0 und daher false. (Deswegen funktioniert ja auch a = b = c = 5 und a, b und c sind 5.)
-
SeppJ schrieb:
*a++; // *a zeigt auf den Nullterminator
Ja. Außerdem schaust du dir das Nullzeichen mit dem * an. Siehe oben. Macht wieder gar nix.
*a++; // *a zeigt auf vielleicht auf den Weg zum Millionär
(undefiniertes Verhalten^^)Ja, das ist nun undefiniert, weil du dir wer weiß was anguckt.
Sicher? Ich dachte lesen sei erlaubt nur schreiben nicht?
-
cooky451 schrieb:
martin_zi schrieb:
"=" ist ja eine Zuweisung. Die ist ja immer true oder nicht ? Oder warum bricht da was ab ?
Der Wert einer Zuweisung ist der Wert der zugewiesen wird. a = 0 ist z.B. 0 und daher false. (Deswegen funktioniert ja auch a = b = c = 5 und a, b und c sind 5.)
Achne
.. tatsächlich .. ich bin doch etwas geschockt das mir das noch nicht so bewusst war 
-
out schrieb:
Sicher? Ich dachte lesen sei erlaubt nur schreiben nicht?
In dem Beispiel ist das nicht undefiniert, aber das hier
const char* p = "A"; ++p; *++p;schon.
-
out schrieb:
SeppJ schrieb:
*a++; // *a zeigt auf den Nullterminator
Ja. Außerdem schaust du dir das Nullzeichen mit dem * an. Siehe oben. Macht wieder gar nix.
*a++; // *a zeigt auf vielleicht auf den Weg zum Millionär
(undefiniertes Verhalten^^)Ja, das ist nun undefiniert, weil du dir wer weiß was anguckt.
Sicher? Ich dachte lesen sei erlaubt nur schreiben nicht?
Nein, einen wilden (oder Null-) Zeiger auch nur zu dereferenzieren ist UB.
-
out schrieb:
Sicher? Ich dachte lesen sei erlaubt nur schreiben nicht?
Ja sicher. Die Adresse könnte zum Beispiel gar nicht gemappt sein.
-
Hallo,
cooky451 schrieb:
In dem Beispiel ist das nicht undefiniert
Klar ist das "undefiniert": http://ideone.com/2E6cm
MfG,
Probe-Nutzer
-
Probe-Nutzer schrieb:
cooky451 schrieb:
In dem Beispiel ist das nicht undefiniert
Klar ist das "undefiniert": http://ideone.com/2E6cm
C Noob.
http://ideone.com/oWQKp
-
Probe-Nutzer schrieb:
Hallo,
cooky451 schrieb:
In dem Beispiel ist das nicht undefiniert
Klar ist das "undefiniert": http://ideone.com/2E6cm
Nein, es ist nicht undefiniert.
int main() { char *a="A";soweit ists ja klar, denke ich.
*a++;hier wird nun a dereferenziert ('A' als ergebnis) und der Zeiger wird um 1 erhöht.
*a++;hier wird nun der erhöhte Zeiger dereferenziert ('\0' als ergebnis) und der Zeiger wird um 1 erhöht und zeigt somit auf Speicherbereich der wahrscheinlich nicht mehr uns gehört. Aber solange er nur zeigt ist das OK.
Ein weiteres
*a++;wäre undefiniert.