Char Zeiger

BLR

Erfahrenes Mitglied
Hallo,

ich habe zwar hier im Forum einen ähnlichen Beitrag gelesen, aber ich habe eine andere Frage dazu.
Standardvorgehensweise bei zeigern:

Code:
int zahl = 10;
int *pIntZeiger = &zahl;

cout << "meine int zahl: "  << *pIntZeiger << "\n";
cout << "Adresse, worauf der Zeiger zeigt: " << pIntZeiger << "\n";

nun habe ich das selbe versucht mit dem Char-zeiger zu machen:

Code:
char zeichen = 'q';
char *pCharZeiger = &zeichen;

cout << "mein  charwert: " << *pCharZeiger << "\n";  \\Ausgabe wie erwartet : q
cout << "Adresse, worauf der Zeiger zeigt:  " << pCharZeiger << "\n"; \\hier wird auch q ausgegeben, statt der Speicerstelle, wo  
                                                                                                                 \\q gespeichert ist
cout << "Adresse von dem char-wert: " << &zeichen << "\n";                \\hier wird ebenfalls nicht die Adresse ausgegeben,  
                                                                                                                 \\sondern der Wert selbst

Wenn ich genauso mit dem int oder string vorgehe, dann funktioniert das....
Warum läuft das so beim char ab****
Wie muss ich beim char vorgehen, damit ich den Wert über den Char-Zeiber auslese und die Adresse, die der Char-zeiger bei sich gespeichert hat.

Danke für jeden Tipp.
 
Hi

das Problem ist, dass Strings (nur als Beispiel das "Adresse, worauf der Zeiger zeigt: ")
eigentlich auch Parameter vom Typ char* sind.
cout hat eine gewollte Ausnahme bei char-Pointern, dass es die als
Auf-einen-String-zeigend annimmt und den String ausgeben will.
Dass es bei dir wirklich nur den einen Buchstaben ausgibt ist Zufall;
normalerweise würde es ab der Speicherstelle so viel char´s ausgeben,
bis es zu einer \0 kommt. (bzw. das tut es auch; bei dir ist nur anscheinend gleich danach eine)

Caste zB. zu (void*), um wieder die normale Pointerbehandlung zu bekommen.
 
Hallo BLR,

Ich vermute das dieses Problem am std::cout liegt.

Da alle Pointer dieselbe Größe auf einem PC haben, kann man den Char-Pointer einfach auf einen Void-Pointer casten und somit auch für das std::cout eine Adresse ausgeben:
C++:
cout << "Adresse, worauf der Zeiger zeigt:  " << (void*)pCharZeiger << endl;

Noch einfacher/verständlicher ist es mit einem printf, bei dem muss man nämlich das Format explizit angeben:

C++:
printf("Adresse, worauf der Zeiger zeigt: %p\n", pCharZeiger);

Mit Zeichenketten funktioniert das ganz ähnlich, nur brauchst nur nicht casten, zumindest kommt mit gcc derselbe output:
C++:
  char *pCharZeiger = &zeichenkette[0];//oder
  pCharZeiger = zeichenkette;

  cout << "mein  charwert: " << *pCharZeiger << endl;
  cout << "Adresse, worauf der Zeiger zeigt:  " << &zeichenkette << endl;
  printf("Adresse, worauf der Zeiger zeigt: %p\n", &zeichenkette);

Bei std::string macht man das in der Regel nicht, zumindest hab ich's noch nicht gebraucht.

Hoffe ich konnte dir helfen und es ist alles richtig.
 
Danke euch für die Hilfe.
Allerdings verstehe ich noch nicht ganz, was ein void* (void-zeiger) bewerkt, sodass es wie erwartet funktioniert.
Wie ist der "Zustand" ohne ihn?
Wie ist der "Zustand" mit ihm?
 
Danke dir :)

also ich glaub, es ist ein Missverständnis entstanden^^
Ich habe einen:
vector<char>
und
vector<char*>

Nun habe ich den vector<char> gefüllt:
Dann den vector<char*> auf jedes Zeichen zeichen lassen.

Nun möchte ich auslesen:
1. Wert, worauf der jeweiliger Zeiger auf den Vector<char> zeigt.
Code:
*pVectorChar.at(i)

2. Diese Adresse
Code:
&pVectorChar.at(i)

3. Die Adresse von die jeweiligen Vector<char> selbst, also ohne pointer.
Code:
 (void*)vectorChar.at(i)

Denn der Wert aus 2 und 3 müsste gleich sein.
 
C++:
#include <iostream>
#include <vector>
 
using namespace std;
 
int main() {
vector<char> cvec = {'a', 'b', 'c', '\0'};
vector<char*> pvec = {&cvec[0], &cvec[1], &cvec[2], &cvec[3]};
 
cout << cvec[0] << '\n' << &cvec[0] << '\n' << pvec[0] << '\n'
<< (void*)&cvec[0]<< '\n' << (void*)pvec[0];
}
Siehe hier.
Alle Klarheiten beseitigt?
 

Neue Beiträge

Zurück