请用指针解释数组

时间:2017-02-06 08:49:18

标签: c++ arrays pointers

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

#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的所有元素的地址。有人可以解释原因。对不起,如果我不能很好地解释这个问题,但我希望你明白我的意思。

2 个答案:

答案 0 :(得分:1)

实际上很遗憾,学生们不再解释记忆管理是如何运作的......

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

指针只是一小段内存(通常是4或8个字节),包含其他内容的地址。例如。它指向数据。

这种情况下的数组是一个字节序列,因为int有4个字节,所以它是40个字节。取消引用数组中的元素意味着读取索引X处的整数。(换句话说:从X * 4读取4个字节,但不包括(X + 1)* 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.它只是分配一个具有正确类型的内存块;仅此而已。

答案 1 :(得分:1)

通过a[i]p[i]访问元素,其中a是一个数组类型,而p是一个指针类型,称为下标运算符,你可以阅读它的内容语义,例如,built in subscript operator

  

...   表达E1 [E2]与表达式*(E1 + E2)

完全相同

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

希望它有所帮助。

我希望你的教授讲授指针,内存布局,解除引用等等的含义。恕我直言,对指针和指针算术有信心是几个月(实际上是几年),而不是一个教训&#34;。