[问题] c语言 有关scanf不加取址符&

楼主: ZephyrusLin (干古专用)   2021-05-07 15:26:59
开发平台(Platform): (Ex: Win10, Linux, ...)
win10
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
vscode + Mingw-w64
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
问题(Question):
版上的各位大神们好:
想请问说为什么我高亮那行的input不用加取址符&,
以下是我的理解 有错的话烦请指正
我的理解 : 从scanf函式可知,我们要传进scanf函式的必须是个内存位址,
所以平时我 们从键盘要读入某数给变量,要用取址符&该变量,但若该变量是个阵列,
因为阵列可以隐性转型成指标,所以不需要取址符&, 且若你加了&,
得到的型态会是char(*)[5], 跟scanf函式希望吃的char *完全不同,所以这情况下是不能
加&
但我的问题是scanf的函式是长这样
int scanf (const char * format, ...)
看起来scanf的第一个参数应该要吃像是%s, %d, %c...等等之类的格式符
又跟我理解的不太一样
不晓得是哪边理解错了
谢谢大大们
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
//输入一个字串并印出
#include <stdio.h>
int main() {
char input[5] = {0};
scanf("%s", input);//不能加&
for(int i = 0; i < 5; i++) {
printf("%c ", input[i]);
}
printf("\n");
return 0;
}
补充说明(Supplement):
作者: stupid0319 (征女友)   2021-05-07 16:17:00
因为阵列代号是个指标指向了阵列
作者: vup4jp6 (精锐猫奴)   2021-05-07 16:55:00
你的问题不是scanf本身 而是array以及Variable Arguments
作者: ctrlbreak   2021-05-07 18:32:00
我当年学C的时候觉得printf很神奇还特别找source code来研究 XD
作者: Lipraxde (Lipraxde)   2021-05-07 19:18:00
恩...应该是可以加的吧?关于 Variable Argument Lists 的处理,System V ABI介绍的十分详细
作者: LPH66 (-6.2598534e+18f)   2021-05-07 20:55:00
关键字是 variadic function, 参数数量可变的函数相关语法是你在宣告上看到的 ... 三个点, 以及 <stdarg.h>
作者: Lipraxde (Lipraxde)   2021-05-08 00:37:00
那个 warning 应该是 compiler 为 scanf 特别产生的,一般自己写的 function 没这种待遇
作者: dces4212 (flawless)   2021-05-08 02:03:00
system V 是其中一种 calling convention 其决定函式呼叫时参数要放哪些暂存器等等
作者: kaneson (Lance)   2021-05-08 07:56:00
第一个参数是吃format, 因为你写了%s 所以下一个参数也是要吃char*, 然而你给他的是固定长的array, 语法虽没有问题,但跟scanf当初设计用意不符,所以用warning提醒.这属一种版本演进的痕迹
作者: vup4jp6 (精锐猫奴)   2021-05-18 10:51:00
const char * format 这个问题可以去查找你在程式码中使用了 "任意字串" 对于compiler是什么意义跟动作

Links booklink

Contact Us: admin [ a t ] ucptt.com