请解释带指针的数组

Please explain arrays with pointers

本文关键字:数组 指针 解释      更新时间:2023-10-16

所以我是编程新手,我想了解教授制作的这个程序中指针的使用。

#include <iostream>
using namespace std;
typedef int* IntPtr;
int main()
{
IntPtr p;
int a[10];
int i;
for(i = 0; i<10; i++)
a[i] = i;
p = a;
for(i = 0; i<10; i++)
cout << p[i]<< " ";
cout << endl;
} 

输出:0 1 2 3 4 5 6 7 8 9

根据我读到的内容,"p=a"将把数组的第一个元素的地址传递给"p"。所以我假设输出将全部为零。但当它打印时,它具有与数组"a"相同的元素。这就像它把a的所有元素的地址都传递给了p。有人能解释一下为什么吗。如果我不能很好地解释这个问题,我很抱歉,但我希望你明白我的意思。

通过a[i]p[i]访问元素,其中a是数组类型,p是指针类型,称为下标运算符,您可以阅读其语义,例如内置的下标运算符:

。。。表达式E1[E2]与表达式*(E1+E2)完全相同

这意味着p[i]*(p + i)相同,即它取消引用存储器地址(p+i)处的值,而i是使用sizeof(int)正确计数的,因为p是指向int的指针。如果p指向a,这与a[i]完全相同,后者也与*(a+i)相同,其中a衰减到指向数组a中第一个元素的指针。

希望能有所帮助。

我希望你的教授教授教授指针的含义、内存布局、去引用等等。IMHO,对指针和指针算术充满信心是几个月(实际上是几年)的问题,而不是一堂"课"的问题。

很遗憾,学生们再也没有解释内存管理是如何工作的。。。

如果你分配了一些东西,它在物理上最终会成为一块连续的内存。也就是说:如果分配一个数组,它是一个连续内存块中的字节序列

指针只不过是一小块内存(通常为4或8字节),其中包含其他东西的地址。例如,它指向数据。

本例中的数组是一个字节序列,因为int有4个字节,所以它是40个字节。取消引用数组中的元素意味着读取索引X处的整数(换句话说:读取从X*4到但不包括(X+1)*4的4个字节——或者更准确地说:[X*4, (X+1)*4>)。

使用指针意味着读取地址所指向的内容。在这种情况下,指针包含数组第一个元素的地址,因此读取*p意味着读取数组的前4个字节。它是p[0]的同义词。

这基本上是有效的,因为数组中的数据是连续存储的,并且没有数据被复制。因此,如果您编写a[2] = 2,它只需覆盖名为数组的内存块中的字节2*4到(2+1)*4(更准确地说:[2*4, (2+1)*4>)。它不会复制、更改p中的地址或其他任何内容。

PS:需要注意的一个重要细节是,在C++中,整数数组之类的东西的分配并不意味着将所有值都设置为0。它只是分配一块具有正确类型的内存;仅此而已。