13

正如标题所说,我一直想知道为什么scanf一定要带address of运算符(&)。

4

8 回答 8

31

因为 C 只有“按值传递”参数,所以要传递一个“变量”来放入一个值,你必须传递它的地址(或指向变量的指针)。

于 2010-10-08T19:18:49.223 回答
15

scanf 不采用“运算符 (&) 的地址”。它需要一个指针。大多数情况下,指向输出变量的指针是通过在 scanf 调用中使用 address-of 运算符获得的,例如

int i;
scanf("%i", &i);
printf("number is: %d\n", i);

但这不是唯一的方法。以下内容同样有效:

int *iPtr = malloc(sizeof(int));
scanf("%i", iPtr);
printf("number is: %d\n", *iPtr);

同样,我们可以用下面的代码做同样的事情:

int i;
int *iPtr = &i;
scanf("%i", iPtr);
printf("number is: %d\n", i);
于 2010-10-08T19:57:26.627 回答
7

因为它需要地址来放置它读取的值。如果将变量声明为指针,则scanf不需要&.

于 2010-10-08T19:19:20.990 回答
3

其他人都很好地描述了 sscanf 需要将其输出放在某处,但为什么不返回呢?因为它必须返回很多东西——它可以填充多个变量(由格式驱动),它返回一个 int 表示它填充了多少个变量。

于 2010-10-08T19:29:55.930 回答
1

当您使用标准输入设备(通常是键盘)输入内容时,通过的数据必须在stored某个地方。您必须point在内存中的某个位置才能将数据存储在那里。对于point内存位置,您需要该address位置的。因此,您必须通过使用&运算符 with来传递变量的地址scanf()

于 2010-10-08T19:20:12.680 回答
1

因为该值将被存储(在哪里?),在内存地址中。所以 scanf() 处理 (&) 运算符。

于 2010-10-09T09:00:20.277 回答
0

它告诉在哪里写入输入值,因为 (&) 运算符的地址给出了变量的地址。因此,带有变量名和地址运算符的 scanf 意味着将值写入该位置。您还可以使用 (&) 运算符的地址和 %p 格式说明符以十六进制格式检查任何变量的地址。

于 2021-10-20T05:30:58.707 回答
0

It's because you are storing something. Just think about how a function must work. With printf, you can think of that as a void function that just outputs the result and then it is done. With scanf you are wanting to RETAIN some data, so you need a pointer aka address where the data you input will be stored even after you leave the function. If you took an argument of data type, say, "int", the data would be lost as soon as you exit the scanf function, in other words, in the next line of code in the parent function, that data you scanfed would be gone.

于 2021-12-01T01:20:22.403 回答