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/49246481/

相关文章:

c - 在 C 中重新排序对多个 volatile 变量的访问

c - 在C中将直接字符串分配给char数组

c# - UTF8Encoding string to byte[] 转换意外行为

JavaScript 从文本字段的动态表中将数据读入数组

c - 为什么 tab[i][j] = "value"段错误

c - 什么时候使用 pthread_spin_lock 是正确的(例如 pthread mutex)?

java - 如何在遍历 vector 时更新 vector 的元素数组及其值

c++ - 通过显式调用类构造函数来使用对象与默认初始化+赋值运算符

c++ - 强制 boost 变体存储指针

c - fprintf 和循环在 c