2012-06-27 57 views
3
void say(char msg[]) 
{ // using pointer to print out the first char of string 
    printf("%c\n", *msg); 
} 

void say(char msg[]) 
{ // using pointer to print out the memory address of the   first char of string 
    printf("%p\n", msg); 
} 

void say(char msg[]) 
{ // using pointer to print out the whole string 
    printf("%s\n", msg); 
} 

前兩個是有道理的,但我不太明白第三個函數是如何工作的。我只知道msg指向字符串第一個字符的內存地址。提前致謝。printf in C - 指針變量%p%c%s

回答

5

%s將解釋的msg爲C字符串,它是封端的一個空字節('\0')序列,和的基編輯部地址的地址,因此與%s中的printf將採取的msg基地址和打印字符等於從msg開始的每個字節並繼續,直到它不遇到空字符。

3

最後一個打印字符串..它開始於味精的內存地址,去,直到達到終止字符「\ 0」

3

由於C字符串是NULL字符\0終止,printf功能會採取這樣的假設並使用指針中的地址打印出所有字符,直到找到NUL字符\0

如果傳入的char數組不是NUL終止,您的程序可能會崩潰,因爲它可能找不到NUL字符並將輸出垃圾,直到它到達未分配的內存位置。

0

最後一條語句預計字符串,因爲格式說明符是%s。它以msg的基地址作爲起始地址,並打印所有字符,直到達到'\ 0',因爲字符串是一個以空字符結尾的字符數組。

0

%P打印出被稱爲變量的堆棧值地址。 例如,如果值a存儲在地址2000. 並且我們在printf()語句中執行%P,則輸出是推入到函數堆棧中的地址。當我們做printf(「%P」,a)時,a的地址將被壓入堆棧。它會打印推送的堆棧值。

+0

這不是他要求的嗎?他想知道第三個人是如何工作的,'%s'。 – MrKiane