【问题标题】:Accessing 2d array with pointers in c++, how to assign address to pointer?在c ++中使用指针访问二维数组,如何为指针分配地址?
【发布时间】:2014-02-08 12:13:18
【问题描述】:

我有一个关于指向二维数组的 c 指针的问题。我们经常写:

int (*p)[3]=a //here a is a 2d array 

但写作:

int (*p)[3]=a[0]

int (*p)[3]=&a[0]

产生与a 基地址相同的结果。如果我们cout p,它会产生与*p相同的结果。

为什么会发生这一切。

【问题讨论】:

  • @Manu343726 上面的声明。 int (*p)[3] 中的 p 是一个 simple 指向 int[3] 数组的指针,而 int *p[3] 中的 p 将是一个包含 3 个指针的数组,它会衰减到 int **

标签: c++ arrays pointers


【解决方案1】:

这是因为数组变量基本上是地址。
所以a[0]将指向第一个一维数组的基地址,因为a本身就是二维数组

【讨论】:

    【解决方案2】:

    此声明

    int (*p)[3]=a[0]
    

    无效,编译器将发出错误。右操作数的类型为int *,而左操作数的类型为int (*p)[3]

    这些陈述

    int (*p)[3]=a
    int (*p)[3]=&a[0]
    

    是等价的,因为右侧的数组 a 被隐式转换为指向其第一个元素的指针。

    至于陈述

    std::cout << p;
    

    std::cout << *p;
    

    然后它们产生相同的结果,因为它们输出分配数组的内存地址。 *p 等价于 a[0] 并隐式转换为指向其第一个元素 &a[0][0] 的指针。所以在这两种情况下,它实际上都是 a[0][0] 的地址,因为数组从第一行开始按行放置在内存中。

    【讨论】:

    • 右边第一条语句的类型是int
    • @David Kernin 你在说什么声明?
    • 对不起,我没有看“二维数组”,取了一维的
    • @user3287033 例如 GCC 发出以下错误:prog.cpp:7:21: error: cannot convert ‘int*’ to ‘int (*)[3]’ in initialization
    【解决方案3】:

    首先:您的代码无效,因为不兼容的类型之间没有强制转换。

    右侧表达式中使用的数组名称被隐式转换为指向数组第一个元素的指针。这是怎么回事:

    #include <iostream>
    using namespace std;
    
    int main() {
        int a[][2] = { {0,0}, {1,1}, {2,2}};
        int (*p)[3]=(int(*)[3])a; // implicitly converted from array name to pointer to the first element (int(*)[2])
        int (*p2)[3]=(int(*)[3])a[0]; // a[3][2], access a[0], an array, implicitly converted to int*
        int (*p3)[3]=(int(*)[3])&a[0]; // Address of int[2] array, int(*)[2] type
    
        cout << p << endl;
        cout << p2 << endl;
        cout << p3 << endl;
    
        // your code goes here
        return 0;
    }
    

    http://ideone.com/qG5riN

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      • 2013-06-29
      • 2018-09-03
      • 2018-01-04
      相关资源
      最近更新 更多