2016-07-29 40 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中的数组名称本身是指第一个数组元素的地址,但对于变量,您需要指定变量的地址。

相关问题