char-Zeiger derefenzieren vs. int-Zeiger derefenzieren
-
Hallo,
Ich hätte eine Frage: warum muss man int-Zeiger derefenzieren und char-Zeiger nicht?
Beispiel-Code:
char *ptr; char my[] = "abcdefg"; int a = 5; int *b = &a; ptr = my; ptr += 5; printf("%s\n", ptr); /* *ptr lässt das Programm abstürzen */ printf("%d", *b);
Vielen Dank
mfg
-
kamged schrieb:
Ich hätte eine Frage: warum muss man int-Zeiger derefenzieren und char-Zeiger nicht?
Du kannst jede Art von Zeiger dereferenzieren, oder nicht, ganz wie du möchtest. In dem Fall von printf() geht es darum, dass man für printf() gerne Arrays von 'char' verwendet, um "Strings" zu konstruieren. Arrays können in C nicht an Funktionen übergeben werden, deshalb übergibt man einen Zeiger auf den Anfang. Das geht so weit, dass der Name eines Arrays in den meisten Ausdrücken auch einfach als Zeiger auf den Anfang verstanden wird.
Wenn du aber in Zeile 10 statt
ptr
schreibst:*ptr
, passiert folgendes: statt dem Zeiger wird der Wert geholt, auf den er zeigt (das Zeichen 'f'). Alle Zeichen sind Ganzzahlen, und beim Rechnen mit Ganzzahlen wird üblicherweise alles zu 'int' konvertiert. So auch hier. Deshalb passiert das gleiche wie beiprintf("%s\n", (int)'f'); // Cast ist unnötig, nur zur Verdeutlichung // das ist in ASCII: printf("%s\n", 107);
Weil printf() aber aus dem Formatstring erfahren hat, dass das 2. Argument ein Zeiger auf 'char' sein wird, passiert irgendetwas unangenehmes.
Vielleicht hilft es, deinem Compiler zu sagen, dass du mehr Warnungen haben willst, zB sagt der gcc in diesem Fall:
Warnung: format »%s« erwartet Typ »char *«, aber Argument 2 hat Typ »int«
-
µngbd schrieb:
Du kannst jede Art von Zeiger dereferenzieren, oder nicht, ganz wie du möchtest.
Nur void-Zeiger kann man gar nicht dereferenzieren.