Probleme mit Zeiger ind Verbindung mit Char-Arrays
-
ich denke ich habe Zeiger soweit verstanden, zumindest bei den einfachen Datentypen. Aber Arrays als Zeiger und char-arrays bereiten mir Verständnisprobleme.
Bsp ein int-array:int zahlenarray[3];
So wie ich das verstehe hat dieses array 3 integer Felder, die alle eine eigene Adresse haben auf dem stack. Will ich an den Inhalt des 2. Felds schreib ich:
zahlenarray[1]
; Will ich an die Adresse des 3. Feld ist es
&zahlenarray[2];
Das ist alles klar. So wie ich gelesen habe sind alle Felder auch Zeiger. Da aber hier kein * vor dem arraybezeichner steht, nimmt man die Klammern zum dereferenzieren der einzelnen Elemente. Will man ohne ohne Klammern dereferenzieren dann schreibt man den * davor also:
*zahlenarray; // Wert des erstes Elements *(zahlenarrays+1); //Wert des 2. Elements ...
das heisst also: *zahlenarray ist gleich zahlenarray[0]
Und schreibt man nur zahlenarray; ist das die Adresse des ersten Elements
zahlenarray+1; =>Adresse des 2. ElementsIch hoff das war soweit richtig. Aber bei den char-arrays ist das anders. Da versteh ich einiges nicht.
Bsp:char carray1[10] = "Buch"; // is klar char carray2[10] = {'B','u','c','h','\0'}; // hier sind beide arrays gleich, ausser die addressen /*wenn nun arrays zeiger sind, die ja adressen enthalten, müsst ja folgende Ausgabe die Adresse des ersten Feldes ausgeben: */ cout << carray1 << endl; // aber hier werden alles chars ausgegeben. das versteh ich nicht
-
Arrays sind keine Zeiger; wenn du ein Array auf den Stack legst, legst du die Speicheradresse des Arrays nicht dorthin. Auch gibt der sizeof-Operator dir die Größe des Arrays zurück, nicht etwa die eines Zeigers.
Arrays sind aber implizit in Zeiger umwandelbar, deswegen funktionieren die ganzen Zeigeroperationen.
Mit der Ausgabe von
cout << carray1 << endl;
hat das allerdings nichts zu tun, da ist lediglich der operator<< so überladen, dass ein char* als String aufgefasst wird. (Übrigens ist das eigentlich eine C++-Frage)
-
ah ok, aber du sagst ja selbst char* obwohl es kein zeiger ist. Ich nehme mal an das felder einfach so behandelt werden. Naja so richtig klar ist es noch nicht.
-
rudpower schrieb:
ah ok, aber du sagst ja selbst char* obwohl es kein zeiger ist. Ich nehme mal an das felder einfach so behandelt werden. Naja so richtig klar ist es noch nicht.
ja weil es auch fast das gleiche ist, der einzige Unterschied ist, das du dem "Zeiger" keinen neuen Wert zuweisen kannst, was willst auch mit nem Array das du nicht mehr ansprechen kannst
, du kannst ja auch einem int xxx; keine neue Speicher Adresse zuweisen, aber mit &xxx auf die Zeiger Adresse zugreifen was dann auch sowas möglich macht (&xxx)[0], für die cout << Geschichten bist im falschen Forum also hopp ab ins C++ Forum
p.s. ich sollte mir mal angewöhnen auf meine groß und klein Schreibung zu achten, scheint fast so als würd sich das hier im Forum ausbreiten, was keine gute Entwicklung ist, ich versuche mich zu bessern, versprochen
lg lolo
-
btw. nachdem da sicher ne ganze menge Fehler drin sind, hab ich mich nicht nur als C-Noob sondern auch als Deutsch-Noob geoutet
aber ist doch sicher nicht so wild, wir sind ja eh im
Fragen zu C für Dummies hier stellen
Forum
-
Es liegt an C++. In C gäbe es zwei Möglichkeiten, vielleicht macht es das Ganze klarer:
char s[6] = "hallo"; printf("%s\n", s); printf("%p\n", s);
-
Es liegt an C++.
printf("%p", ...)
ist afaik als einziges verlässlich.volatile int numbers[] = {17, 37, 42}; std::cout << numbers[0] << std::endl; std::cout << &numbers[0] << std::endl;
-
Geht auch mit Strings:
volatile char s[] = "hallo"; std::cout << s[0] << std::endl; std::cout << &s[0] << std::endl; std::printf("%p\n", &s[0]);
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
cout << (void*)carray1 << endl;
-
rüdiger schrieb:
cout << (void*)carray1 << endl;
Funktioniert. Ist aber imo ein Workaround, und abgesehen davon 1.) kontraintuitiv und 2.) inkonsistent. Liegt das daran, dass
volatile
erst später dazugekommen ist, und dann die Anzahl der Überladungen explodiert wäre, wenn man es sauber eingebaut hätte?
-
rüdiger schrieb:
cout << (void*)carray1 << endl;
Soll man C-casts in C++ benutzen?