c - 数组名是指针吗?

标签 c arrays pointers

数组的名称是 C 中的指针吗? 如果不是,数组名称和指针变量有什么区别?

最佳答案

数组是数组,指针是指针,但在大多数情况下,数组名称​​转换为指针。经常使用的术语是它们衰减为指针。

这是一个数组:

int a[7];

a 包含七个整数的空间,您可以通过赋值将值放入其中一个整数中,如下所示:

a[3] = 9;

这是一个指针:

int *p;

p 不包含任何整数空格,但它可以指向整数空格。例如,我们可以将其设置为指向数组a中的一个位置,例如第一个:

p = &a[0];

令人困惑的是,您还可以这样写:

p = a;

不会将数组a的内容复制到指针p中(无论这意味着什么)。相反,数组名称 a 被转换为指向其第一个元素的指针。因此该分配与前一个分配的作用相同。

现在您可以以与数组类似的方式使用p:

p[3] = 17;

此方法有效的原因是 C 中的数组解引用运算符 [ ] 是根据指针定义的。 x[y] 表示:从指针 x 开始,在指针指向的内容之后向前移动 y 个元素,然后取其中的内容。使用指针算术语法,x[y] 也可以写为 *(x+y)

要使其适用于普通数组,例如我们的 a,必须首先转换 a[3] 中的名称 a指向一个指针(指向 a 中的第一个元素)。然后我们向前推进 3 个元素,并采取其中的任何内容。换句话说:取出数组中位置 3 的元素。 (这是数组中的第四个元素,因为第一个元素的编号为 0。)

因此,总而言之,C 程序中的数组名称(在大多数情况下)会转换为指针。一个异常(exception)是当我们在数组上使用 sizeof 运算符时。如果在此上下文中将 a 转换为指针,则 sizeof a 将给出指针的大小,而不是实际数组的大小,这将毫无用处,因此case a 表示数组本身。

关于c - 数组名是指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39507446/

相关文章:

python - 如何使用 ctypes 和线程为 C 回调函数分配内存

c - 缓冲区溢出在 x86 上需要 16 个字节,但在 x64 上需要 29 个字节

在 C 中创建 md5sum

PHP循环遍历多维数组并更改值

javascript - 在表格单元格内循环对象并创建无序列表

c - 使用来自另一个结构的元素创建结构(错误 : expected specifier-qualifier-list before 'type' )

c - C 的新手 : Compiling in Visual Studio Code. .. 错误 : gcc not recognized?

javascript - 简单的 Array.prototype 给出了 TypeError

c++ - 指向全局结构变量

c - 神秘变化的结构成员(涉及指针):