我知道数组名称可以用作指针(虽然它是一种转换形式),但我的问题是,是否有其他一些实例,其中数组作为指针。
从技术上讲,数组名不能用作指针。一个具有数组类型(可以是数组名称)的表达式将进行转换在数组类型不合法的情况下使用指针,但指针类型是合法的。并且将数组的声明转换为函数参数转换为指针的声明。(这意味着这个名字不是一个数组名,但指针名。尽管外表。)
这是由于数组到指针的标准转换。具体来说,数组衰变成指向数组第一个元素的指针。
数组衰减为指针,我认为,因为数组和指针的使用方式完全相同:使用索引,可以自增或自减,在两个方向上,向前和向后遍历元素。
以下是C语言标准的相关部分(您要求使用C,您得到的就是C):
6.3.2.1左值、数组和函数指示符
…除非它是sizeof操作符或一元&操作符的操作数,或者是a用于初始化数组的字符串字面值,类型为" array of type "的表达式为转换为类型为"指向类型的指针"的表达式,该指针指向的初始元素数组对象和不是左值。如果数组对象具有寄存器存储类,则行为未定义。
…6.5.2.1数组下标
约束
其中一个表达式的类型应该是"指向对象的指针类型",另一个表达式应该是具有整数类型,并且结果类型为" type "
语义
后跟方括号[]
中的表达式的后缀表达式是一个下标数组对象的一个元素的指定。下标操作符[]
的定义E1[E2]
和(*((E1)+(E2)))
是一样的。因为转换规则应用于二进制+
操作符,如果E1
是一个数组对象(相当于指向数组对象的初始元素),E2
是一个整数,E1[E2]
表示E2
-thE1
的元素(从0开始计数).
…6.7.5.3函数声明符(包括原型)
…将形参声明为"类型的数组"应调整为"指向的限定指针"type ",其中的类型限定符(如果有的话)是在控件的[
和]
中指定的数组类型派生。的[
和]
中也出现关键字static
数组类型派生,然后对于每次调用的函数,得到相应的值实际实参应提供对数组的第一个元素的访问,该数组至少有相同数量的元素元素,由大小表达式指定
这里需要注意的重要一点是,对象(在C语言中,是占用内存的东西)和我们用来指代该对象的表达式之间是有区别的。数组始终是数组,但用于引用该对象的表达式通常是指针类型。
The identifier itself tells the base address of the memory block.
int arr[SIZE];
arr
+------+------+---- ----+------+
| | | . . . | |
+------+------+---- ----+------+
arr[0] arr[1] arr[2] arr[n-1] arr[n]
The `arr' holds the address of the base address of the block
int *arr = malloc (sizeof (int) * SIZE);
arr
+------+
|addr1 |------------+
+------+ |
addr_of_arr |
|
|
V
+------+------+---- ----+------+
| | | . . . | |
+------+------+---- ----+------+
addr1[0] addr[1] addr1[n-1] addr1[n]
C中的数组基本上只是保留连续内存块的指针。所以本质上,数组总是像指针一样。