【问题标题】:Array of Pointers Pointing to an unknown location指向未知位置的指针数组
【发布时间】:2019-04-12 16:52:43
【问题描述】:

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

#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 是什么?
  • 这只是一个实验。我在互联网上搜索了一些关于它的东西。但徒劳无功。所以我把它贴在这里。
  • 那么cout&lt;&lt;b 的结果是什么,为什么您认为它令人困惑?
  • 我想知道内存中的 b 指向什么。我的意思是地址 b 里面是什么。
  • b 不是指针,它是一个数组。在您最喜欢的 C++ 书籍中阅读有关数组衰减为指向其第一个元素的指针的内容。

标签: c++ arrays pointers output cout


【解决方案1】:

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 的元素进行了任何更改,则保存在b 元素指向的内存位置中的值将会改变,但是b 持有的那个值的地址将保持不变。

【讨论】:

    【解决方案2】:

    b被传递给cout&lt;&lt;操作符时,它衰减成一个指针;因此就打印功能而言,打印出b与打印出&amp;b[0]是一样的。

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

    【讨论】:

    • 在指针衰减的上下文中它可能在逻辑上是等价的,但通常数组是与指针不同的类型
    【解决方案3】:

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

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

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

    观看现场演示here

    如图:

    【讨论】:

      【解决方案4】:

      b 整个数组的内存地址。

      【讨论】:

      • 我猜 array 的地址是 array 的 0 索引。但是这个地址比那个地址提前了 20 个字节。 . .
      • 如果您查看 b 的大小,您会发现它是 3 个整数的大小。它是整个容器。 (是的,我明白你的意思......)
      • 别忘了程序中有两个数组; aba 数组从 0x6ffe30 开始,长 12 字节(3 个 4 字节整数),而 b 数组从 0x6ffe10 开始,长 24 字节(3 个 8 字节指针)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 2016-07-30
      • 1970-01-01
      相关资源
      最近更新 更多