数组的名称是 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/