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

时间:2011-10-07 16:47:53

标签: c++ c arrays pointers

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

5 个答案:

答案 0 :(得分:13)

从技术上讲,数组名称永远不会充当指针。一个 数组类型(可能是数组名称)的表达式将转换 任何时候数组类型不合法,但指针类型是指针。 并且转换数组作为函数参数的声明 进入指针的声明。 (这意味着名称不是 数组名称,但指针名称。尽管出现了。)

答案 1 :(得分:1)

以下是C language standard的相关部分(您要求C,这就是您得到的):

6.3.2.1左值,数组和函数指示符
...
3除非它是sizeof运算符或一元&运算符的操作数。运营商,或者是 用于初始化数组的字符串文字,类型为''数组 type ''的表达式是 转换为类型为''指向 type '的指针的表达式,指向的初始元素 数组对象并不是左值。如果数组对象有寄存器存储类,则 行为未定义。
...
6.5.2.1数组下标

约束

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

语义

2后缀表达式后跟方括号[]中的表达式是下标 指定数组对象的元素。下标运算符[]的定义 是E1[E2](*((E1)+(E2)))相同。由于转换规则 应用于二进制+运算符,如果E1是一个数组对象(等效地,指向 数组对象的初始元素)和E2是一个整数,E1[E2]表示E2 - th E1的元素(从零开始计算) ...
6.7.5.3函数声明符(包括原型)
...
7参数声明为“ type ”的数组应调整为''限定指针 输入'',其中类型限定符(如果有)是在[]内指定的类型限定符。 数组类型推导。如果关键字static也出现在[]内 数组类型派生,然后对每个函数调用,对应的值 实际参数应提供对至少具有至少数量的数组的第一个元素的访问 size表达式指定的元素

重要的一点是,对象(在C意义上,占用内存的东西)和我们用来引用该对象的表达式之间存在差异。数组总是数组,但用于引用该对象的表达式通常是指针类型。

答案 2 :(得分:0)

这是由于 array-to-pointer 标准转换。具体来说,数组衰减成指向数组第一个元素的指针。

数组衰减为指针,我认为,因为数组和指针的使用方式完全相同:使用 index ,可以递增和递减,在两个方向上遍历元素,前进和后退..

答案 3 :(得分:0)

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]

答案 4 :(得分:-3)

C中的数组基本上只是保留连续内存块的指针。所以本质上数组总是像指针一样。