在c语言中,数组何时充当指针?
when does a array act as a pointer in 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中的数组基本上只是保留连续内存块的指针。所以本质上,数组总是像指针一样。
相关文章:
- 何时在引用或唯一指针上使用移动语义
- 如果非动态变量被指针引用,何时超出范围?
- 指针的 C++ 动态数组 - 何时需要使用它?
- 我可以有一个 ELI5 作为参考和指针以及何时使用它们吗?
- 何时返回指针与返回对象的一般经验法则?
- __unaligned说明符何时与指针一起使用?
- c++:何时传递指针与返回对象
- 何时/如何在使用指针后正确删除指针?
- 指向派生类的指针中的"static_cast<Base*>(static_cast<void*>(派生))"何时有效?
- 何时删除 try-catch 块中的指针
- C 何时将指针用于向量
- 我该如何允许类型的对象非专业化并在不使用指针的情况下识别何时是这种情况
- 我们可以使用指针和何时使用空参数
- 为什么或何时用指针声明int
- 何时对对象使用 new,何时使用指针
- 如何以及何时复制指针
- 在c语言中,数组何时充当指针?
- 何时删除[]指针c++
- 何时使用指针成员变量
- 在c++中何时将指针指向指针作为参数传递给函数