Forum: PC-Programmierung pointer auf char/anfängerfrage


von jooee (Gast)


Lesenswert?

Frage siehe Kommentar:
1
#include <stdio.h>
2
#include <stdlib.h>
3
4
int main() {
5
char zeile[10] = "Hallo";
6
char *p_anfang;
7
p_anfang = &zeile[0];
8
printf(">>%s<<\n",p_anfang);  //Weshalb  wird hir nicht die Addresse von "z"                           //ausgegeben?
9
p_anfang = zeile;
10
printf(">>%s<<\n",p_anfang);
11
printf(">>%s<<\n",zeile);
12
p_anfang = &zeile[1]; 
13
printf(">>%s<<\n",p_anfang);
14
return 0;
15
}
Hier wird schließlich auch die Addresse ausgegeben:
1
#include <stdio.h>
2
#include <stdlib.h>
3
4
int main() {
5
int zeile = 5;
6
int *p_anfang;
7
p_anfang = &zeile;
8
printf(">> %d <<\n",p_anfang);
9
10
return 0;
11
}

Gruß Jooee

von Floh (Gast)


Lesenswert?

jooee schrieb:
> printf(">>%s<<\n",p_anfang);  //Weshalb  wird hir nicht die Addresse von "z" 
//ausgegeben?

jooee schrieb:
> printf(">> %d <<\n",p_anfang);

Such den Unterschied :-)

von Kai S. (zigzeg)


Lesenswert?

Das liegt am Formatierungszeichen "%s" (fuer Stringausgabe) bzw. "%d" 
fuer die Ausgabe einer Integer-Zahl mit Vorzeichen. Das korrekte 
Formatierungszeichen um einen Zeiger auszugeben (=eine Adresse) ist 
uebrigens "%p". Die Verwendung von "%d" kann - je nach Compiler - zu 
einer Warnung fuehren.

ZigZeg

von jooee (Gast)


Lesenswert?

Hallo,
ja gut dass dies am Formatierungszeichen s und d liegt glaub ich euch ja 
aber weshalb bekomme ich in c++ bei folgendem Code nicht die Addresse?
1
#include <iostream>
2
using namespace std;
3
4
int main()
5
{
6
    char zeile[10]="hallo";
7
    char *p_zeile;
8
    p_zeile = &zeile[0];//  mit dem &_operator weise ich doch p_zeile die addresse von h zu.
9
    cout << p_zeile << endl; // Ausgabe ohne Derefernzierungsoperator müsste mir doch die Addresse liefern!
10
    return 0;
11
}

Gruß Jooee

von nicht Gast (Gast)


Lesenswert?

Weil cout meint es ist cleverer als Du.
Versuch das gleiche mit printf unter c++ und die Welt ist wieder ok.

von jooee (Gast)


Lesenswert?

Das ist eine antwort, wie keine...

von nicht Gast (Gast)


Lesenswert?

Oder anders:

Bei
1
cout << zeile << endl;
erwartest Du doch das er den Text ausgibt und nicht die Adresse des 
Ersten Zeichens von Zeile oder?

char zeile[] und char *zeile ist das Gleiche!

von jooee (Gast)


Lesenswert?

dann akzeptiere ich das halt so auch wenn mir die Logik nicht klar 
ist...


Danke Gruß Jooee

von kein Fachmann (Gast)


Lesenswert?

Es ist halt so definiert.
Ich habs jetzt nicht ausprobiert, aber wenn man den pointer auf void* 
castet, würde ich tatsächlich erwarten, dass cout den pointer selbst als 
Hexzahl ausgibt.

von nicht Gast (Gast)


Lesenswert?

Ist doch eigentlich nicht so schwer:

cout ist halt etwas komplexer, der Wald-und-Wiesen Programmierer kann 
irgendwas reinschieben und cout erkennt was zu tun ist, man muss sich 
nicht um irgendwelche Formatoperatoren kümmern. Schiebt man eine Zahl 
ein wird diese ausgegeben, schiebt man einen Buchstaben rein, kommt 
dieser heraus. Schiebt man einen String rein so wird dieser ausgegeben 
und genau hier liegt das Problem cout kann nicht unterscheiden ob ein 
String kommt oder ein Pointer auf ein Char, da es wie bereits oben 
erwähnt das Gleiche ist. Da allerdings viel häufiger Strings mit cout 
ausgegeben werden als Pointeradressen haben die Programmierer der cout 
Funktion nunmal entschieden das bei einem char-Pointer dessen Inhalt und 
nicht die Adresse ausgegeben werden soll.

von Rolf Magnus (Gast)


Lesenswert?

jooee schrieb:
> Hallo,
> ja gut dass dies am Formatierungszeichen s und d liegt glaub ich euch ja
> aber weshalb bekomme ich in c++ bei folgendem Code nicht die Addresse?
>
> #include <iostream>
> using namespace std;
>
> int main()
> {
>     char zeile[10]="hallo";
>     char *p_zeile;
>     p_zeile = &zeile[0];//  mit dem &_operator weise ich doch p_zeile die 
addresse von h zu.

Ja. Äquivalent wäre:
1
p_zeile = zeile;

>     cout << p_zeile << endl; // Ausgabe ohne Derefernzierungsoperator müsste mir 
doch die Addresse liefern!

Nein. Wie kommst du darauf, daß das so sein müßte? p_zeile ist ein 
Zeiger auf char, und cout interpretiert den immer als Zeiger auf den 
Anfang eines Strings, den es dann ausgibt. Der Unterschied zu printf 
ist, daß letzteres variable Argumentlisten verwendet und daher keine 
Ahnung hat, von welchem Typ die übergebenen Argumente sind. Deshalb muß 
man mit dem Formatstring mit Sachen wie %s angeben, welchen Typ man 
übergeben hat. cout kann durch überladene Operatoren automatisch den Typ 
erkennen, und wenn der char* ist, wird eben der Text ausgegeben.

>     return 0;
> }

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.