Unklarheit mit char*
-
Stromberg schrieb:
bei Beispiel 2) muss doch doch der "&" bei "string" weg, oder? "&string" gibt doch die Adresse der Zeigervariable aus
muss nicht, der Zeiger eines Arrays referziert auf sich selbst (bzw. aufs erste Element).
#include <stdio.h> #define is_array(x) \ ((void*) x == (void*) &x) #define am_i_an_array(x) \ if(is_array(x)) \ printf(#x " is an array!\n"); \ else \ printf(#x " is not an array!\n"); int main(void) { char array[] = "I am an array"; char *pointer = "I am a pointer"; am_i_an_array(array); am_i_an_array(pointer); return 0; }
Ausgabe
$ ./amianarray array is an array! pointer is an array!
klar kann man hier tricksen, mit
pointer=&pointer;
aber wer machst das schon? (außer man will seinen stack freiwillig zerschiessen)
-
Dann hab ich dass wohl verwechswelt, aber bei NICHT char Zeigern ist es doch so?
int main() { int value = 1027; int *pointer = &value; cout << pointer << endl; //OUT: Adresse von "value" cout << &pointer << endl; //OUT: Adresse von "pointer" cout << *pointer << endl; //OUT: Wert der Variable (value) auf die der Zeiger (pointer) zeigt return 0; }
Korrekt?
Wie kann ich dann die Adresse eine char Zeiger Array Variable ausgeben?
Kann man sagen (zum bessern Verständnis), dass es 2 Typen von char Zeigern gibt.
1. char Array Zeiger, welche man nicht inkrementieren... kann.
2. einfach nur char Zeiger, welche man inkrementieren kann, und die Adressen von char Array Zeigern aufnehmen kann.
???
Oder gibts dafür spezielle Fachwörter?MfG
Stromberg
-
Stromberg schrieb:
Wie kann ich dann die Adresse eine char Zeiger Array Variable ausgeben?
mit einem & (adressoperator) davor.
Stromberg schrieb:
1. char Array Zeiger, welche man nicht inkrementieren... kann.
2. einfach nur char Zeiger, welche man inkrementieren kann, und die Adressen von char Array Zeigern aufnehmen kann.du kannst jeden pointer rauf und runterzählen, was abziehen, usw. nur nicht bei void-pointern.
-
Stromberg schrieb:
Kann man sagen (zum bessern Verständnis), dass es 2 Typen von char Zeigern gibt.
nein. Ein beliebter Fehler ist es Arrays und Zeiger als gleich zu betrachten, weil ihre Handhabung dieselbe ist. Aber Arrays und Zeiger sind nich dasselbe. Arrays lassen sich implizit als Zeiger verwenden [1], also ohne Konverierung, sind aber keine Zeiger. Zeigerarithmetik oder Zuweisung geht nicht [2]. Umgekehrt ist es so, dass man bei Zeigern auf die Daten implizit über den []-array-Operator lesen/schreiben kann [3] aber dennoch keine Arrays sind [4].
Klar?
[1]
deswegen ist es möglichchar name[] = "supertux"; printf("%s\n", name);
[2]
char name[] = "supertux"; name++; /* geht schief */ name = "fricky"; /* ebenso */
[3]
char *name = "supertux"; int len = strlen(name); for(i=0;i<len;++i) printf("name[%d]=%c\n", i, name[i]);
[4]
sizeof((void*)) == sizeof((char*)) == sizeof((int*)) =0 sizeof((struct wasauchimmer*)) == .... aber char text[] = "abcdefghijklmnopqrstuvwxyz"; sizeof((char*)) != sizeof(text)
Wie kann ich dann die Adresse eine char Zeiger Array Variable ausgeben?
was ist für dich eine "char Zeiger Array Variable"?
-
ein glück dass, das so einfach ist...
http://www.c-plusplus.net/forum/viewtopic-var-t-is-231231.html
-
Ist dass hier nun die Adresse auf die der Zeiger zeigt, oder die Adresse der Zeigervariable?
int main() { char temp[11] = "Hallo Welt"; //char Array char *p = temp; //char Zeiger cout << &p << endl; return 0; }
Die Adresse der Zeigervariable oder?
MfG
Stromberg
-
Exakt.
-
Und wie kann ich die Adresse rausbekommen, auf welche der char Zeiger zeigt? Weil sobald ich die Adresse mit "cout << p << endl;" ausgeben möchte wird ja gleich, automatisch dass ganze Wort hingeschrieben.
MfG
Stromberg
-
das liegt an C++s << Operator, der beim char* den String ausgeben will.
std::cout << (void*) p << std::endl;
sollte die Adresse ausgeben. Aber wir sind im ANSI C Forum, also
printf("p zeigt auf %p\n", p);
-
Stromberg schrieb:
Und wie kann ich die Adresse rausbekommen, auf welche der char Zeiger zeigt? Weil sobald ich die Adresse mit "cout << p << endl;" ausgeben möchte wird ja gleich, automatisch dass ganze Wort hingeschrieben.
nimm niemals 'cout'. cout versucht immer schlauer zu sein, als der programmierer. benutze besser 'printf'.
printf ("%p\n", p);
-
@supertux
Joa sry, ich treib mich normalerweise auch nur im C++ Forum herum, aber dass hat mich halt interessiert, und ich wollte nicht extra einen neuen Thread aufmachen. Aber jetzt weiss ich alles was ich wissen wollte. Dankeschön.MfG
Stromberg