正如标题所说,我一直想知道为什么scanf
必须使用&
地址操作符。
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);
因为它需要一个地址来存放读取的值。如果你将变量声明为指针,scanf
就不需要 &
了。
其他人已经很好地描述了sscanf需要将其输出放在 某个地方,但为什么不返回它呢?因为它必须返回许多东西——它可以填充多个变量(受格式驱动),并返回一个表示它填充了多少个变量的int值。
由于值将被存储在内存地址中(哪里?),因此scanf()使用(&)运算符进行处理。
它告诉了在哪里写入输入值,因为取地址(&)运算符给出变量的地址。所以,scanf与变量名称和地址运算符一起使用,意味着将值写入此位置。 您还可以使用地址(&)运算符和十六进制格式说明符%p检查任何变量的地址。
这是因为你正在存储某些东西。想一想函数的工作方式。使用printf,你可以将其视为一个无返回值的函数,只输出结果,然后完成。使用scanf,你想要保留一些数据,因此你需要一个指针,即地址,输入的数据将被存储在其中,即使你离开函数后仍然存在。如果你使用数据类型"int"作为参数,那么在退出scanf函数时,数据将会丢失,换句话说,在父函数中的下一行代码中,你scanf的数据将会消失。
char*
的变量已经包含了一个地址 [指向字符串中的第一个字符]。那么,为什么scanf
不能使用该地址将用户输入加载到其中呢? - Mehdi Charife