指向第一个元素的指针的地址

时间:2018-10-09 12:29:24

标签: c++ arrays pointers

http://www.fredosaurus.com/notes-cpp/arrayptr/array-diagrams.html网站上,它指出

  

指针保存其他数据的内存地址,并用黑盘表示,箭头指向其引用的数据。

例如

int a[5];  // Allocates memory for 5 ints.
. . .
a[0] = 1;
for (int i=1; i<5; i++) {
a[i] = a[i-1] * 2;
}

将导致。 enter image description here

我的问题是如何打印指向数组的指针的地址? 我知道&a&a[0]给我们第一个元素的地址。但是如何访问指向数组的指针?

4 个答案:

答案 0 :(得分:1)

数组和指针不是同一件事。真正的记忆是这样的:

   a
-------
|  1  |  a[0]
-------
|  2  |  a[1]
-------
|  4  |  a[2]
-------
|  8  |  a[3]
-------
| 16  |  a[4]
-------

因此,如果您要打印a&a,则会看到它们打印相同的值。

答案 1 :(得分:1)

如果数组在堆栈中,如示例代码中所示,则下图更准确地表示了内存的布局方式。我还添加了一个额外的指针,希望可以进行一些澄清。

int a[5];
a[0] = 1;
for (int i=1; i<5; i++)
    a[i] = a[i-1] * 2;

int* b = a;

更容易想到将数组定义为一点语法糖的[]表示法。调用函数并传递a时,将使用传递的a[0]的地址来调用函数。

b传递给函数时,它将是要传递的值,即a的地址。

答案 2 :(得分:0)

您可以有很多指向a[0]的指针。

就如同指向数组的指针一样,创建一个指向a[0]的指针变量,然后获取指向它的指针。您将有一个指针指向该数组的一个指针。

答案 3 :(得分:0)

  

我知道&a&a[0]为我们提供了第一个元素的地址。

从技术上讲。 &a实际上是数组本身的地址。它的值与第一个元素的地址相同。但是请注意,表达式的类型不同。 &aint (*)[5](指向5个整数的数组的指针),而&a[0]int*(指向整数的指针)。

  

我的问题是如何打印指向数组的指针的地址?

第一步是要有一个指针。您的示例中没有任何指针变量。数组不是指针。页面中的句子“实际的数组变量,在此示例中为a,是指向其所有元素的内存的指针。” 该页面具有很大的误导性,因为数组不是指针对象。绘制的图不适用于该程序。

以下是根据图中正确的程序:

int array[5];   // Allocates memory for 5 ints.
int* a = array; // a pointer to the first element of the array
a[0] = 1;
for (int i=1; i<5; i++) {
    a[i] = a[i-1] * 2;
}

实际上,我们有一个指针。现在您可以打印指针的地址:

std::cout << &a;