Adressen
-
Hallo!
Habe ein Problem mit Adressen:
Warum wird hier eine Adresse ausgegeben?
char a[20] = "Hello World"; cout << "Array: " << &a << endl;Hier aber nicht?
cout << "Array[0]: " << &a[0] << endl; cout << "Array[1]: " << &a[1] << endl;Bei Zeigern hingegen funktioniert es.
Aber hier wiederum nicht (zumindest nicht richtig):
char c = 'c'; cout << "Normal: " << &c << endl;
-
Neuling09 schrieb:
Hallo!
Habe ein Problem mit Adressen:
Warum wird hier eine Adresse ausgegeben?
char a[20] = "Hello World"; cout << "Array: " << &a << endl;weil &a die Adresse eines char-Arrays zurückgibt, also einen "char **", wenn du so willst
Hier aber nicht?
cout << "Array[0]: " << &a[0] << endl; cout << "Array[1]: " << &a[1] << endl;a[0] ist ein char und &a[0] ein char *
&a[0] wird als nullterminierte Zeichenkette ausgewertet, also bis nach Hello World.
mit &a[1] verhält es sich genausoAber hier wiederum nicht (zumindest nicht richtig):
char c = 'c'; cout << "Normal: " << &c << endl;genau das gleiche.
Wenn du unbedingt eine Adresse aus einem Element eines char-Arrays ausgeben willst, dann z.B. so:
std::cout << "0x" << std::hex << reinterpret_cast<std::size_t>(&a[0]) << std::endl
-
Paul Manns schrieb:
weil &a die Adresse eines char-Arrays zurückgibt, also einen "char **", wenn du so willst
Falsch! &a ist gibt die Adresse auf das Array Objekt zurück. Also ein
char (*)[20]. Seltsamer Typ, aber er existiert:char a[20]; char** p1 = &a; // FEHLER char* p2 = &a; // FEHLER char (*p3)[20] = &a; // RICHTIGPaul Manns schrieb:
std::cout << "0x" << std::hex << reinterpret_cast<std::size_t>(&a[0]) << std::endlDas geht einfacher:
std::cout << static_cast<void*>(&a[0]) << std::endl;char c = 'c'; std::cout << &c << std::endl;Dies löst übrigens undefiniertes Verhalten aus. Ganz lustiger Fehler, irgendwie.
char*,const char*,wchar_t*undconst wchar_t*werden von den Streams immer als nullterminierte Strings angeschaut. Sie werden also wie Zeiger auf Arrays behandelt und es werden Zeichen ausgegeben, bis ein 0 Byte gefunden wird.Grüssli
-
Das ist eigenartig. Hab es eben mit int versucht und es hat geklappt.
Aber warum funktioniert das mit einem char Datentypen nicht?
Ich danke dir Paul!

-
Dravere schrieb:
Dies löst übrigens undefiniertes Verhalten aus. Ganz lustiger Fehler, irgendwie.
Ja eben, bei mir wurde auch das ganze Array ausgegeben.
-
Dravere schrieb:
Paul Manns schrieb:
weil &a die Adresse eines char-Arrays zurückgibt, also einen "char **", wenn du so willst
Falsch! &a ist gibt die Adresse auf das Array Objekt zurück. Also ein
char (*)[20]. Seltsamer Typ, aber er existiert:char a[20]; char** p1 = &a; // FEHLER char* p2 = &a; // FEHLER char (*p3)[20] = &a; // RICHTIGund wieder was dazugelernt^^
