为什么sscanf需要&;用于%d个整数,但不用于%s字符串

为什么sscanf需要&;用于%d个整数,但不用于%s字符串,c,scanf,C,Scanf,我对sscanf例程中的参数感到困惑 #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); #包括 char语句[20]; char first_name[7];

我对sscanf例程中的参数感到困惑

#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);
#包括
char语句[20];
char first_name[7];
char last_name[7];
智力年龄;
strcpy(句子“AAAAA bbbbbb 20”);
sscanf(句子,“%s%s%d”、名、姓和年龄);
为什么字符数组不需要加前缀&而整数变量需要加前缀


谢谢

C中的字符串是一个后跟“\0”字符的字符序列。C中数组的名称是初始元素的地址。因此,对于单个整数,需要添加“&”以传递要存储int的地址。

在C中,数组的名称表示基址。

sscanf()
中,需要传递存储变量值的内存位置。所以
&
表示
的地址,如果是原语类型,则用于获取地址。这就是为什么
&
int
数据类型一起使用的原因。但是字符串是字符数组(后跟
'\0'
),name提供了基址。

在C中,字符数组的标识符作为指向数组第一个元素的指针衰减

sscanf()
函数需要一个指向内存位置的指针才能写入,如果传递
int
类型,则应在变量名前面加上
&
,这样才能有效地传递变量的地址。这样,sscanf可以直接写入变量的内存位置。您是通过引用而不是复制来传递参数


由于数组名称已衰减为指向数组第一个元素的指针,因此不需要在其前面加上
&
,因为
sscanf
已经访问了内存位置。

&
在被调用函数中意味着地址

sscanf
需要变量的地址,以便它可以将从给定字符串读取的值存储到这些地址中(从而存储在这些变量中)


C中的数组名本身指的是第一个数组元素的地址,但对于变量,您需要指定变量的地址。

因为数组名是对基地址的引用,所以数组会衰减到指针,所以它已经具有动态分配的字符串地址,你的可变句子可以写得像
char*句子=malloc(sizeof(char)*20)
也许这会帮助你理解它们都是指针,但不是指向同一类型的数据:
arr
是指向给定类型的x元素数组的指针,
&arr
是指向给定类型的x元素数组的指针,
&arr[0]
是指向数组元素类型的指针。否,你的类型搞错了,数组名变成了指向数组第一个元素的指针,而不是整个数组(当然它有相同的原始值)。@hyde:你说得对,帖子被更正了。我把
&语句
与之混淆,后者返回指向数组的指针,而不是第一个元素。