当对数组使用 scanf
时,无论我是否使用“&”运算符,该函数似乎都能正常工作。我想知道编译器如何在字符数组的情况下看到“&”运算符
我已经知道 scanf
在使用单个字符时传递指针。在数组的情况下,变量本身存储指向第一个元素的指针。
我确切的问题是,当我使用 &ch
(而 ch 是字符串)时,我们是否创建双指针?那么编译器是如何运行的
int main()
{
char ch,s[100],sen[100];
scanf("%c",&ch);
scanf("%s",s);
scanf(" %[^\n]%*c",sen);
}
最佳答案
When using scanf for arrays, it seem that the function works fine whether I use '&' operator or not.
“似乎”是关键词。
除非它是 sizeof
或一元 &
运算符的操作数,或者是用于在声明中初始化字符数组的字符串文字,否则 “T
的 N 元素数组”类型的表达式 将转换(“衰减”)为“指向 T
的指针”类型的表达式,并且值表达式的地址将是数组第一个元素的地址。
如果您将 scanf
调用为
scanf( "%s", s );
表达式 s
由类型“char
的 100 元素数组”转换而来 (char [100]
) 到“指向 char
的指针”(char *
),其值是数组第一个元素的地址 (&s[0]
).
如果您将 scanf
调用为
scanf( “%s”, &s );
s
是一元 &
的操作数,因此不会发生转换,表达式 &s
> 的类型为“指向 char
的 100 个元素数组的指针”(char (*)[100]
)。这是一个问题,因为 %s
转换说明符需要一个 char *
类型的参数。传递任何其他类型的参数都会导致未定义的行为 - 操作可能会按预期工作,或者可能会彻底崩溃,或者可能会损坏数据,或者可能会使程序处于错误状态,例如稍后会崩溃,等等。
两个表达式 s
和 &s
解析为相同的值 - 数组的地址与其第一个元素的地址相同- 但它们的类型不同,并且在C中不同的指针类型可能有不同的表示(IOW,char *
的地址值存储方式可能与为 char (*)[100]
存储地址值的方式。所以
scanf( "%s", &s );
在某些平台上可能会失败。
My exact question is when I use &ch(while ch is string) do we create double pointer?
没有。如果 ch
声明为 char ch
,则 &ch
的类型为 char *
。如果 ch
声明为 char ch[N]
,则 &ch
的类型为 char (*)[N]
。
关于c - Scanf 中 & 运算符的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56951091/