在c语言中,数组何时充当指针?



我知道数组名称可以用作指针(虽然它是一种转换形式),但我的问题是,是否有其他一些实例,其中数组作为指针。

从技术上讲,数组名不能用作指针。一个具有数组类型(可以是数组名称)的表达式将进行转换在数组类型不合法的情况下使用指针,但指针类型是合法的。并且将数组的声明转换为函数参数转换为指针的声明。(这意味着这个名字不是一个数组名,但指针名。尽管外表。)

这是由于数组到指针的标准转换。具体来说,数组衰变成指向数组第一个元素的指针。

数组衰减为指针,我认为,因为数组和指针的使用方式完全相同:使用索引,可以自增或自减,在两个方向上,向前和向后遍历元素。

以下是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中的数组基本上只是保留连续内存块的指针。所以本质上,数组总是像指针一样。

最新更新