指向未知位置的指针数组

时间:2018-11-09 05:24:41

标签: c++ arrays pointers output cout

我正在使用指针数组进行练习。 我写了一个简单的代码。

#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]给出了预期的结果。

4 个答案:

答案 0 :(得分:4)

b {em> int的指针数组。它的地址是第一个指针的地址

  • 第一个指针b[0]被分配了元素a[0]地址(因此b[0]指向1)。
  • b[1]分配了 {em> a[1]地址(因此b[1]指向2
  • b[2]分配了 {em> a[2]地址(因此b[2]指向3

在每种情况下,b数组中的指针都保存a中相应元素的地址。因此,如果在循环中将a中的地址分配给a后对b的元素进行了任何更改,则{{ 1}}将更改,但是b所保存的该值的地址将保持不变。

答案 1 :(得分:3)

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

其地址不取决于其数组分配给哪些元素。

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

观看现场演示here

图片上:

enter image description here

答案 2 :(得分:3)

b传递给cout的{​​{1}}运算符时,它会衰减为一个指针。因此,就打印功能而言,打印<<与打印b相同。

因此,&b[0]打印出cout << b;数组中第一个指针的地址。 (请注意,指针的地址与指针指向的地址不是相同!这可能会引起混淆,请记住,指针变量是变量同样,与其他任何变量一样,它在内存中具有自己唯一的位置,这与它所指向的位置不同)

答案 3 :(得分:2)

b整个数组的内存地址。