首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么字符数组在以下上下文中的工作方式类似于指针

为什么字符数组在以下上下文中的工作方式类似于指针
EN

Stack Overflow用户
提问于 2021-01-08 11:16:12
回答 2查看 54关注 0票数 0

对于下面的代码,我可以对scanf使用指针或字符数组

代码语言:javascript
复制
char name[10];
printf("Please enter your name: ");
scanf("%9s", name);

我也可以这样做:

代码语言:javascript
复制
char *name = (char*)malloc(10)
printf("Please enter your name: ");
scanf("%9s", name);

第二个显然是一个char*指针,但第一个不是--它是一个数组。为什么,如果它不是数组,并且scanf需要一个指针,那么我可以执行scanf("%9s", name)而不是被强制执行scanf("%9s", &name)

EN

回答 2

Stack Overflow用户

发布于 2021-01-08 12:37:23

除非它是sizeof或一元&运算符的操作数,或者是用于在声明中初始化字符数组的字符串文字,否则“T的N元素数组”类型的表达式将被转换为“指向T的指针”类型的表达式,并且表达式的值是数组的第一个元素的地址。

这适用于所有数组类型,而不仅仅是字符数组。

所以当你写下

代码语言:javascript
复制
scanf("%9s", name);

表达式name从“char的10元素数组”类型转换为“指向char的指针”,scanf接收的是数组的第一个元素的地址。

这一点很重要-数组不是指针;数组表达式会在必要时转换为指针。

信不信由你,这种行为是有原因的。C是从早期的语言B派生而来的。在B中,数组对象有一个指向第一个元素的显式指针,下标操作a[i]被定义为*(a + i) -给定起始地址a,从该地址偏移i元素并取消对结果的引用。

在设计C时,Ritchie希望保留B的数组语义,但他不想保留这些语义所需的第一个元素的显式指针。因此,他没有为指针创建存储空间,而是创建了在必要时将数组表达式转换为指针表达式的规则。

这就是为什么数组很奇怪的原因。

票数 2
EN

Stack Overflow用户

发布于 2021-01-08 12:49:59

当使用"%9s"作为格式说明符时,scanf不会“接受指针或数组”。它只需要一个指针。当你给它一个数组的时候,会发生什么,编译器会变魔术。它创建一个指向数组第一个元素的指针,并将该指针传递给scanf。所以这两段代码是等价的:

代码语言:javascript
复制
/* Snippet A */
char name[10];
scanf("%9s", name);

/* Snippet B */
char name[10];
scanf("%9s", &name[0]);

这不仅发生在scanf上,而且几乎每次需要一个指针并给它一个数组时都会发生。值得注意的是没有发生这种情况的地方是sizeof运算符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65622975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档