数组名称和指向第一个元素的另一个指针有什么区别?

时间:2015-02-01 18:23:00

标签: c++ arrays pointers

有一个数组A,定义为int A[10],还有另一个包含基址的指针,定义为int *ptr = A

我最近看过这篇文章 How to find the 'sizeof' (a pointer pointing to an array)?,我无法弄清楚A和ptr之间的区别。 Aren他们俩只拥有阵列的基地址?

我们现在可以互换使用A[i] and ptr[i],对于某个小于10的整数。

那么为什么使用sizeof()获得的结果有差异?

2 个答案:

答案 0 :(得分:5)

数组是一个数组。数组是内存中连续的项目序列。对于 n 项目数组,sizeof报告的尺寸 n 是每个项目尺寸的倍数。

指针是一个指针。指针值(实际上)是某事物的存储器地址。指针的大小基本上是内存地址的大小。

在某些上下文中,一个表达式引用一个数组,衰减指向数组中第一个项目的指针,并结合支持例如与指针一起使用的索引表示法,可以使指针看起来类似于数组。当你例如衰败时,就不会发生衰变。通过引用传递一个数组,或者将它用作sizeof的参数,但是当你例如向数组添加一个整数,如"Hello"+2。这对于数组本身没有意义,因此数组表达式衰减(指向可作为内置+的参数的指针类型。)

最重要的是,在某些上下文中,数组类型调整为指针类型。例如,带有签名void foo(int a[42]);的函数已调整void foo(int* a);。这意味着可以使用任何指向int的指针调用该函数,无论它是否指向数组中的元素。 Array decay 意味着您可以调用函数传递数组的名称,但函数中a的类型为int*

答案 1 :(得分:0)

指针ptr指向A数组的内存中的位置。 数组A包含所有元素

这就是为什么数组占用更多内存然后指针,指针只包含数组A

的地址

将其视为桌面上的快捷ptr和文件A的真实位置,使用两者都可以运行程序