有一个数组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()获得的结果有差异?
答案 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
的真实位置,使用两者都可以运行程序