数组何时充当c中的指针?

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

从技术上讲,数组名称永远不会充当指针。 具有数组类型(可以是数组名称)的表达式将在数组类型不合法时转换为指针,但指针类型为。 并且将数组声明作为函数参数转换为指针的声明。 (这意味着名称不是数组名称,而是指针名称。尽管有外观。)

以下是C语言标准的相关部分(您要求C,这就是您得到的):

6.3.2.1左值,数组和函数指示符

3除非它是sizeof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则将类型为”array of type ”的表达式转换为类型为”指针的表达式键入 ”指向数组对象的初始元素,而不是左值。 如果数组对象具有寄存器存储类,则行为未定义。

6.5.2.1数组下标

约束

1其中一个表达式应具有类型”指向对象类型的指针”,另一个表达式应具有整数类型,结果具有类型” type ”。

语义

2后缀表达式后跟方括号[]的表达式是数组对象元素的下标名称。 下标运算符[]的定义是E1[E2](*((E1)+(E2))) 。 由于适用于binary +运算符的转换规则,如果E1是数组对象(等效地,指向数组对象的初始元素的指针)并且E2是整数,则E1[E2]指定E2E2个元素。 E1 (从零开始计数)。

6.7.5.3函数声明符(包括原型)

7参数声明为” 类型数组”应调整为”限定指向类型 ”,其中类型限定符(如果有)是在数组类型派生的[]中指定的那些。 如果关键字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中的数组基本上只是保留连续内存块的指针。 所以本质上数组总是像指针一样。