在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;
}
我的问题是如何打印指向数组的指针的地址?
我知道&a
或&a[0]
给我们第一个元素的地址。但是如何访问指向数组的指针?
答案 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
实际上是数组本身的地址。它的值与第一个元素的地址相同。但是请注意,表达式的类型不同。 &a
是int (*)[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;