为什么scanf函数必须使用地址运算符?

13

正如标题所说,我一直想知道为什么scanf必须使用&地址操作符。

8个回答

33
因为C语言只有“按值传递”的参数,所以要将一个“变量”传递到函数中以便赋值,必须传递它的地址(或指向该变量的指针)。

这是因为你正在存储某些东西。想一想函数的工作原理。使用printf,你可以将其视为一个void函数,只输出结果,然后完成。使用scanf,你想要保留一些数据,所以你需要一个指针,即地址,输入的数据将被存储在其中。如果你采用了数据类型参数,比如“int”,那么数据将会在你退出scanf函数时丢失,换句话说,在父函数的下一行代码中,你scanf的数据将会消失。 - sethlearn
对于字符串而言,类型为 char* 的变量已经包含了一个地址 [指向字符串中的第一个字符]。那么,为什么 scanf 不能使用该地址将用户输入加载到其中呢? - Mehdi Charife

15

scanf不接受 "取地址运算符(&)",它需要一个指针。通常在scanf调用中使用取地址运算符获取输出变量的指针。

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);

7

因为它需要一个地址来存放读取的值。如果你将变量声明为指针,scanf 就不需要 & 了。


4

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


1
当你使用标准输入设备(通常是键盘)输入某些内容时,通过的数据必须要被“存储”到某个地方。你必须在内存中“指向”一个位置,以便数据可以被存储在那里。为了指向一个内存位置,你需要知道那个位置的“地址”。因此,你必须使用“&”运算符和“scanf()”一起传递变量的地址。

1

由于值将被存储在内存地址中(哪里?),因此scanf()使用(&)运算符进行处理。


0

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


0

这是因为你正在存储某些东西。想一想函数的工作方式。使用printf,你可以将其视为一个无返回值的函数,只输出结果,然后完成。使用scanf,你想要保留一些数据,因此你需要一个指针,即地址,输入的数据将被存储在其中,即使你离开函数后仍然存在。如果你使用数据类型"int"作为参数,那么在退出scanf函数时,数据将会丢失,换句话说,在父函数中的下一行代码中,你scanf的数据将会消失。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接