2017-08-15 50 views
1

我有這樣的代碼:當`char first_word [MAX_LENGTH + 1] =「test」;`,是first_word是一個指針還是一個字符串?

char first_word[MAX_LENGTH + 1] = "test"; 
printf("Word to input: %s\n", first_word); 
printf("Word to input: %p\n", first_word); 

它成功地打印出兩個(打印字符串「Test」,然後一個地址)。

在我的代碼,我最終做到這一點:

char *arr_of_strings[MAX_LENGTH + 1]; 
arr_of_strings[0] = first_word; 

,並正確地設置arr_of_strings[0]到任何first_word是(在這種情況下是一個指針,因爲*arr_of_strings是一個指針數組,對吧?)。但現在,當我做

printf("arr at 0 is: %s\n", arr_of_strings[0]); 

它再次打印字符串,可我還可以打印地址,像這樣:

printf("arr at 0 is: %p\n", arr_of_strings[0]); 

所以當不C使用first_word爲一個字符串,當它用它作爲指針?

+1

奇怪的是,您的代碼已經回答了您的問題。每個'first_word'都是一個指向字符串第一個字符的指針。您在'printf'行中混淆了'first_word',但'%s'已經告訴編譯器,關聯變量保存指向字符串第一個字符的指針,而不是字符串本身。所以,'arr_of_strings [0]'是一樣的:當與'%p'一起使用時,它打印它的指針值;當與'%s'一起使用時,它會打印指向的字符串。 – ssd

+4

'first_word'是一個'char'數組。該類型是'char [MAX_LENGTH + 1]'。當作爲表達式計算時,指向第一個元素('&first_word [0]')。 C字符串是一個以NUL字符結尾的字符序列。因此,指針點是否爲C-String取決於它是否以NUL結尾的一系列字符。 – BLUEPIXY

回答

3

正確的答案是字符數組的標識符。

  • 不是字符串,因爲一個甚至不是在C.在C A串被定義爲一個字符序列包括一個0/'\0'字符末(一種類型的表明結束)。所以,first_word可以持有一個字符串,但你不能說它一個字符串。它可以保存任何序列的char,而不僅僅是字符串。

  • 不是指針,雖然它在大多數情況下的計算結果爲指針。除與sizeof,_Alignof&一起使用外,數組的標識符被評估爲指向其第一個元素的指針。因此,在許多情況下,first_word將具有類型char *(指針類型),您可以例如將其分配給像char *foo = first_word這樣的指針。仍然,評估到一個指針並不意味着它一個指針。運算符sizeof,_Alignof&在數組上使用時與在指針上使用時會得出非常不同的結果。


關於你提到的有關的printf的問題:%s printf中需要一個字符指針(char *)傳遞,並期待指針指向的字符串。我希望你在閱讀了上面的解釋後明白這意味着什麼。

1

在精確可變長度和地址來說的:

情況1:

char str1[] = "test"; 

分配一個5個字節的存儲空間,說從0x00500x0054,和str1是第一個字符的地址的字符串;即在這種情況下爲0x0050

當在printf使用具有%s格式說明中,編譯器知道str1是字符的陣列,直接發送地址的str1printf功能和它打印的字符串。

當在printf使用具有%p格式說明中,編譯器假定編碼器是感興趣的字符串的地址;再次發送地址str1printf函數,這一次,它打印字符串的地址。

情況2:

char *str2 = "test"; 

分配一個5個字節的存儲器空間,從說到0x00500x0054。然而,這次,str2是存儲在另一個地址中的指針,比如0x0030;它的值是0x0050,指向字符串的第一個字符。

當在printf使用具有%s格式說明中,編譯器知道str2是指向字符的陣列,將存儲在str2printf函數;不是str2的地址。

當在printf使用具有%p格式說明中,編譯器假定編碼器是感興趣的字符串的地址;再次將存儲在str2中的發送到printf函數。

案例3:

char *arrStr[4]; 
arrStr[0] = str1; 

這裏,編譯器的行爲類似上面的情況2。

當在printf使用具有%s格式說明中,編譯器知道arrStr[0]是指向字符的陣列,將存儲在arrStr[0]printf功能(實際上,此是str1的地址);而不是地址arrStr[0]

當在printf使用具有%p格式說明中,編譯器假定編碼器是感興趣的字符串的地址;再次將存儲在arrStr[0]中的發送到printf函數。

所以,如果你有興趣在地址arrStr[0](不 它指向的值)的,你應該使用&arrStr[0]%p格式說明。

+0

'&arrStr [0]'與沒有任何操作符的'arrStr'完全相同,請參閱我的答案。 (採取以下步驟查看:&& arrStr [0]' - >'&(*(arrStr + 0))' - >'&* arrStr') –

相關問題