c - Scanf 中 & 运算符的使用

标签 c

当对数组使用 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/

相关文章:

c - `-Wextra` 标志在 clang 编译器中意味着什么?

c - 传递给 C 函数的结构指针即使在前向声明后也不起作用

c++ - _stprintf_s 将 "10"视为 "1"

c - 在 C 编程中将值从字符数组传输到整数数组

c - 尾递归调用(C入门加书本例子)

c - Visual Studio 2017 上忽略了 typedef

C 递归 : return statement

c - 在简单驱动程序中使用函数时意外调用

c - SPI写STM32很慢

c - 查找字符串中的位数时出现错误结果