printf() druckt den ganzen array
Nehmen wir an ich habe folgenden code in meinem C-Programm:
#include <stdio.h>
void PrintSomeMessage( char *p );
int main(int argc, char *argv[]) {
char arr[10] = "hello";
PrintSomeMessage(&arr[0]);
return 0;
}
void PrintSomeMessage(char *p)
{
printf("p: %s",p);
}
Warum der Ausgang von diesem sein würde, das ganze Wort "Hallo" statt des Zeichens "h"?
Ich verstehe aber, dass, wenn ich eine "%c"
im formatter, es wird gedruckt, nur einen einzigen Brief. Aber trotzdem ist die Speicher-Adresse für jeden Buchstaben in dieser Adresse ist anders. Bitte, jemand es mir erklären?
- Warum kann ich nicht brauchen, um dereferenzieren ein-Zeichen-Zeiger in C, bevor Sie ihn drucken?
- Hinweis:
%c
nicht braucht-Adresse zu drucken, wo, wie%s
Reisen müssen, bis\0
wie @Rohan erklärte in der Antwort. printf()
mit%c
müssen Wert die variable, die ganz offensichtlich/logisch, dass Sie nicht benötigen, sollten Adresse für den Zugriff auf den Wert für single - element werden können(pass-by-value). Wo sind die print-string-es müssen die Adresse zu Reisen, bis\0
Begegnung gleichen Rohan erklärte in seiner Antwort. Zusätzlich im Speicher speichern scanf braucht-Adresse, auch mit%c
- Zu
printf()
eine%c
müssen Sie mindestens einechar
variable, nicht seine Adresse. - Beachten Sie,
&arr[0]
≡&*(arr+0)
≡&*arr
≡arr
, soPrintSomeMessage(&arr[0])
≡PrintSomeMessage(arr)
- Im Grunde die gleiche Frage wie stackoverflow.com/questions/16909490/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Speicher-Adresse unterscheidet, sondern als Ihr array von Zeichen, Sie sind aufeinander aufbauend. Wenn Sie übergeben die Adresse des ersten Elements und verwenden
%s
,printf
druckt alle Zeichen beginnend von der angegebenen Adresse bis er Sie findet'\0'
.Incase arrays, die Basis-Adresse (d.h. die Adresse des array) ist die Adresse
das 1. element im array. Auch die array-Namen fungiert als Zeiger.
Betrachten eine Reihe von Häusern (jedes element im array). Die Zeile identifizieren,
Sie brauchen nur die 1. Haus-Adresse.Sie wissen, jedes Haus ist gefolgt von der nächsten (sequentiell).Immer die Adresse des 1. Haus, erhalten Sie auch die Adresse der Zeile.
Incase string-Literale(character-arrays definiert, bei der Deklaration), sind Sie automatisch
angehängt von
\0
.printf ()
Drucke mit dem format-Bezeichner und die Adresse. Da verwenden Sie%s
druckt es aus der 1. Adresse (Inkrementieren den pointer mit Arithmetik), bis '\0'