C 何时使用&;?

C 何时使用&;?,c,scanf,C,Scanf,为什么scanf对int需要一个&而对char则没有 int main () { char str [80]; int i; printf ("Enter your family name: "); scanf ("%s",str); printf ("Enter your age: "); scanf ("%d",&i); return 0; }

为什么scanf对int需要一个&而对char则没有

  int main ()
     {
        char str [80];
        int i;

        printf ("Enter your family name: ");
        scanf ("%s",str);  
        printf ("Enter your age: ");
        scanf ("%d",&i);

        return 0;
    }

str
衰减为指针,因为它是一个数组(因此它指向它的第一个元素,这并不意味着数组和指针是一样的)
i
需要
&
因为
scanf
需要存储值的地址,所以它需要
i
的地址
str
衰减为指针,因为它是数组(因此它指向它的第一个元素,这并不意味着数组和指针是一样的)
i
需要
&
,因为
scanf
需要存储值的地址,所以它需要
i
的地址
scanf()
需要一个指针(内存地址),将数据扫描到其中。虽然
str
是一个字符数组,但当表达式中使用
str
时(例如,作为scanf的参数),它实际上表示其第一个元素的内存地址。但是,对于
int
,必须明确告诉
scanf()
使用其内存地址,这就是为什么要使用
&
(address of)运算符。

scanf()
需要一个指针(内存地址),用于将数据扫描到其中。虽然
str
是一个字符数组,但当表达式中使用
str
时(例如,作为scanf的参数),它实际上表示其第一个元素的内存地址。但是,对于
int
,必须明确告诉
scanf()
使用其内存地址,这就是为什么要使用
&
(address of)运算符。

因为case是
str
数组第一项的地址,而
i
只是int的名称,
&i
表示
int i
的地址,因为
str
是数组第一项的地址,而
i
只是int的名称,
&i
表示
int i
标准库函数
scanf()
需要一个对应于要读取的数据的指针。所以你总是需要传递一个指针

char[]
的情况下,数组名会衰减为指向数组第一个元素的指针,这就是为什么不使用
&
字符数组的原因。事实上,在传递到scanf()时,对字符数组使用符号(
&
)是错误的,因为
&charArray
的类型是
char(*)[N]
,而scanf()希望格式说明符
%s
使用
char*

如果您有指针,那么您可以直接传递它们。例如

int *p;
char *c;
p = malloc(sizeof(int)); // one int
c = malloc(100); // 100 bytes  
scanf("%d%99s", p, c);
如上所述,此处不使用
&
,因为参数已经是指针,使用
&
是错误的,因为这将使它们指向指针


因此,只要scanf()的参数不是指向要读取的对象类型的指针,就使用
&

标准库函数
scanf()
需要一个与要读取的数据对应的指针。所以你总是需要传递一个指针

char[]
的情况下,数组名会衰减为指向数组第一个元素的指针,这就是为什么不使用
&
字符数组的原因。事实上,在传递到scanf()时,对字符数组使用符号(
&
)是错误的,因为
&charArray
的类型是
char(*)[N]
,而scanf()希望格式说明符
%s
使用
char*

如果您有指针,那么您可以直接传递它们。例如

int *p;
char *c;
p = malloc(sizeof(int)); // one int
c = malloc(100); // 100 bytes  
scanf("%d%99s", p, c);
如上所述,此处不使用
&
,因为参数已经是指针,使用
&
是错误的,因为这将使它们指向指针


因此,只要scanf()的参数不是指向要读入的对象类型的指针,就可以使用
&

搜索“数组指针衰减”,了解为什么使用
str
作为scanf参数而不使用
&
。它也可以写成
&str[0]
(这也意味着“指向第一个元素的指针”,但更明确地说)。请记住操作符(
&
)的地址会产生一个指针,因此
和一些字符数组
返回一个
字符(*)[80]
,即指向80字符数组的指针。这不是你想要的。“为什么scanf需要一个&来表示int,而不需要一个char?”-它也需要
&
来表示char。但是你没有一个字符,你有一个完整的字符数组。搜索“数组指针衰减”,了解为什么使用
str
作为scanf参数而不使用
&
。它也可以写成
&str[0]
(这也意味着“指向第一个元素的指针”,但更明确地说)。请记住操作符(
&
)的地址会产生一个指针,因此
和一些字符数组
返回一个
字符(*)[80]
,即指向80字符数组的指针。这不是你想要的。“为什么scanf需要一个&来表示int,而不需要一个char?”-它也需要
&
来表示char。但是你没有一个字符,你有一个完整的数组。