数组名和另一个指向第一个元素的指针有什么区别?
What is the difference between the name of an array and another pointer pointing to the first element?
有一个数组A,定义为int A[10]
,还有一个包含基地址的指针,定义为int *ptr = A
。
我最近看到这个post
How to find the 'sizeof' (a pointer pointing to an array)?,我搞不懂A和ptr有什么区别。两者不都只是拥有数组的基地址吗?
对于小于 10 的整数 i,我们现在可以互换使用这两个 A[i] and ptr[i]
。
那么为什么使用 sizeof() 获得的结果会有所不同?
数组是数组。数组是内存中连续的项目序列。对于 n 个项目的数组,sizeof
报告的大小是每个项目大小的 n 倍。
指针是指针。指针值(实际上)是某物的内存地址。指针的大小本质上就是内存地址的大小。
在某些上下文中,表达式引用数组,衰减指向数组第一项的指针,并且结合对例如与指针一起使用的索引符号可以使指针看起来类似于数组。当你例如通过引用传递一个数组,或者将它用作 sizeof
的参数,但它确实发生在你例如向数组添加一个整数,如 "Hello"+2
。这对于数组本身没有意义,因此数组表达式衰减(到可以用作内置 +
的参数的指针类型)。
此外,在某些情况下,数组类型调整为指针类型。例如,签名为 void foo(int a[42]);
的函数 调整为 为 void foo(int* a);
。这意味着可以使用指向 int
的任何指针调用该函数,而不管它是否指向数组中的元素。 Array decay 表示你可以调用传递给它的函数的数组名称,但是函数中 a
的类型是 int*
.
指针 ptr
指向 A
数组在内存中的位置。
数组 A
包含所有元素
这就是为什么数组比指针占用更多内存的原因,指针只包含数组的地址A
将其想象成桌面上的快捷方式 ptr
和文件的实际位置 A
,同时使用两者都可以 运行 程序
有一个数组A,定义为int A[10]
,还有一个包含基地址的指针,定义为int *ptr = A
。
我最近看到这个post How to find the 'sizeof' (a pointer pointing to an array)?,我搞不懂A和ptr有什么区别。两者不都只是拥有数组的基地址吗?
对于小于 10 的整数 i,我们现在可以互换使用这两个 A[i] and ptr[i]
。
那么为什么使用 sizeof() 获得的结果会有所不同?
数组是数组。数组是内存中连续的项目序列。对于 n 个项目的数组,sizeof
报告的大小是每个项目大小的 n 倍。
指针是指针。指针值(实际上)是某物的内存地址。指针的大小本质上就是内存地址的大小。
在某些上下文中,表达式引用数组,衰减指向数组第一项的指针,并且结合对例如与指针一起使用的索引符号可以使指针看起来类似于数组。当你例如通过引用传递一个数组,或者将它用作 sizeof
的参数,但它确实发生在你例如向数组添加一个整数,如 "Hello"+2
。这对于数组本身没有意义,因此数组表达式衰减(到可以用作内置 +
的参数的指针类型)。
此外,在某些情况下,数组类型调整为指针类型。例如,签名为 void foo(int a[42]);
的函数 调整为 为 void foo(int* a);
。这意味着可以使用指向 int
的任何指针调用该函数,而不管它是否指向数组中的元素。 Array decay 表示你可以调用传递给它的函数的数组名称,但是函数中 a
的类型是 int*
.
指针 ptr
指向 A
数组在内存中的位置。
数组 A
包含所有元素
这就是为什么数组比指针占用更多内存的原因,指针只包含数组的地址A
将其想象成桌面上的快捷方式 ptr
和文件的实际位置 A
,同时使用两者都可以 运行 程序