C 何时使用&;?
为什么scanf对int需要一个&而对char则没有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; }
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。但是你没有一个字符,你有一个完整的数组。