2016-07-29 37 views
1

我感到困惑的論點sscanf的常規爲什麼sscanf的需要及爲%d整數但不能%s的字符串

#include <string.h> 
char sentence[20]; 
char first_name[7]; 
char last_name[7]; 
int age; 

strcpy(sentence, "aaaaaa bbbbbb 20"); 
sscanf(sentence, "%s %s %d", first_name, last_name, &age); 

這是爲什麼字符數組不需要&前綴,但整型變量呢?

謝謝

+3

因爲數組名稱是對基地址的引用 – sinsuren

+0

數組衰減爲指針,所以它已經有字符串地址 –

+0

用動態分配,你的變量語句可以像'char * sentence = malloc(sizeof(char )* 20);'也許這會幫助你理解 –

回答

3

在C A字符串是後跟一個 '\ 0' 字符的字符序列。 C中數組的名稱是初始元素的地址。因此,對於單個整數,您需要添加'&'以傳遞要存儲int的地址。

0

在C中,數組的名稱表示基地址。
sscanf()中,您需要傳遞可以存儲變量值的內存位置。所以&意味着address of,用於獲取原始類型的地址。這就是爲什麼&int數據類型一起使用。但字符串是字符的數組(後面跟着'\0'),name提供基地址。

+2

它們都是指針,但不是同一類型的數據:'arr'是指向給定類型的x元素數組的指針,'&arr'是指針,指向一個給定類型的x元素數組的指針,'&arr [0]'是一個指向數組元素類型元素的指針。 – naccyde

-1

在C中,字符數組的標識符被衰減爲指向數組的第一個元素的指針。

sscanf()功能需要一個指向一個內存位置中它來寫,如果你傳遞一個int類型,你應該&這對於影響變量前綴名傳遞變量的地址。這樣,sscanf可以直接寫入變量的內存位置。您通過引用傳遞參數,而不是通過複製。

由於數組名稱已衰減爲指向數組的第一個元素的指針,因此sscanf已經可以訪問內存位置,因此不需要以&作爲前綴。

+2

不,你的類型錯了,數組名稱變成了指向數組*的第一個元素的指針,而不是整個數組(它當然具有相同的原始值)。 – hyde

+0

@hyde:你說得對,該帖子已更正。我混淆了'&句子,它返回一個指向數組的指針,而不是第一個元素。 – naccyde

0

&在被調用函數中暗示地址爲

sscanf需要變量的地址,以便它可以將給定字符串的讀取值存儲到這些地址(並因此存儲在這些變量中)。

C中的數組名稱本身是指第一個數組元素的地址,但對於變量,您需要指定變量的地址。

相關問題