数组的名称是C中的指针吗?如果不是,数组名称和指针变量有什么区别?
数组是数组,指针是指针,但在大多数情况下,数组名称会 转换 为指针。经常使用的一个术语是它们 衰减 为指针。
这是一个数组:
int a[7];
a包含七个整数的空间,您可以通过赋值将一个值放入其中,如下所示:
a
a[3] = 9;
这是一个指针:
int *p;
p不包含任何整数空格,但它可以指向整数空格。例如,我们可以将其设置为指向数组中的一个位置a,例如第一个:
p
p = &a[0];
令人困惑的是,您也可以这样写:
p = a;
这不会 将 数组的内容复制a到指针p中(无论这意味着什么)。相反,数组名称a被转换为指向其第一个元素的指针。因此,该作业与前一个作业相同。
现在您可以p以与数组类似的方式使用:
p[3] = 17;
这样做的原因是 C 中的数组解引用运算符[ ], 是根据指针定义的。x[y]意思是:从指针开始,在指针指向x的地方向前y移动元素,然后取那里的任何东西。使用指针算术语法,x[y]也可以写成*(x+y).
[ ]
x[y]
x
y
*(x+y)
为此,要使用普通数组,例如 our ,必须首先将in 中a的名称转换为指针(指向 中的第一个元素)。然后我们向前迈进 3 个元素,并取走那里的任何东西。换句话说:取数组中位置 3 的元素。(这是数组中的第四个元素,因为第一个元素编号为 0。)a``a[3]``a
a``a[3]``a
因此,总而言之,C 程序中的数组名(在大多数情况下)被转换为指针。一个例外是当我们sizeof在数组上使用运算符时。如果a在这种情况下转换为指针,sizeof a将给出指针的大小而不是实际数组的大小,这将是无用的,所以在这种情况下a意味着数组本身。
sizeof
sizeof a