指向未知位置的指针数组

Array of Pointers Pointing to an unknown location

我在练习指针数组。 我写了一个简单的代码。

#include<iostream>
using namespace std;

int main(){

    int a[3]={1,2,3};
    int *b[3];

    for(int i=0; i<3; i++){
        b[i] = &a[i];
    }

    cout<<b; //This gives a confusing output
    cout<<endl;

    for(int i=0; i<3; i++){
        cout<<b[i];
        cout<<endl;
    }
}

输出

0x6ffe10
0x6ffe30
0x6ffe34
0x6ffe38

现在我不明白b指向哪里。 我知道这听起来很奇怪,但我想知道。 b指针指向的地方。 b[0]、b[1]、b[2] 给出预期结果。

b 是指向 int 的指针数组,它是堆栈上的局部变量。

它的地址不依赖于它的数组的各个元素被分配给什么。

如果在 for 循环之前打印它的值(在其中为其成员分配值),您将看到它与打印的值相同 for 循环之后。

查看现场演示 here

图示:

b 整个数组的内存地址。

b 传递给 cout<< 运算符时,它会衰减为指针;因此就打印功能而言,打印出 b 与打印出 &b[0].

相同

因此,cout << b;打印出b[3]数组中第一个指针的地址。 (请注意,指针的地址 与指针指向的地址不是 相同的东西!这可能是混淆的根源 - 请记住指针变量也是一个变量,并且像任何其他变量一样,它在内存中有自己独特的位置,这与它指向的位置不同)

b 是指向 int 指针数组。它的地址是第一个指针地址。

  • 第一个指针 b[0] 被分配给 元素 a[0] 地址(所以 b[0] 指向 1)。
  • b[1] 分配给 a[1] 地址(因此 b[1] 指向 2
  • b[2] 分配给 a[2] 地址(因此 b[2] 指向 3

在每种情况下,b 数组中的指针都保存着 a 中相应元素的地址。因此,如果在循环将 a 中的地址分配给 b 之后对 a 的元素进行了任何更改,则 [= 的元素指向的内存位置中保存的值10=] 会改变,但 b 持有的那个值的地址将保持不变。