You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ClassB中定义指向ClassA内myOwnClass二维数组的指针?

搞定C++二维数组的指针指向问题

嘿,我明白你卡在哪了——静态二维数组的指针类型和你想的myOwnClass***完全不是一回事,咱们一步步捋清楚:

先回顾一维数组的正确逻辑

你说一维数组myOwnClass* myArray[16]能用myOwnClass** myArrayPointer指向,这个是对的:数组名myArray会退化为指向第一个元素的指针,而每个元素是myOwnClass*,所以指针类型就是myOwnClass**,逻辑没毛病。

二维数组的类型到底是什么?

假设你在ClassA里的二维数组是固定大小的,比如这样:

// 10行16列,每个元素是myOwnClass*
myOwnClass* my2DArray[10][16];

这个数组本质是**“包含10个元素的数组,每个元素又是包含16个myOwnClass*的数组”**。当你把my2DArray作为指针用的时候,它会退化为指向第一个“16元素数组”的指针,所以正确的指针类型应该是:

myOwnClass* (*my2DArrayPointer)[16];

这是个指向“16个myOwnClass*组成的一维数组”的指针,才和你的二维数组类型匹配。

实际代码示例

ClassA里的二维数组声明

class ClassA {
public:
    // 固定大小的二维数组
    myOwnClass* my2DArray[10][16];

    ClassA() {
        // 简单初始化元素(假设myOwnClass有默认构造)
        for (int i = 0; i < 10; ++i) {
            for (int j = 0; j < 16; ++j) {
                my2DArray[i][j] = new myOwnClass();
            }
        }
    }
};

ClassB里正确绑定指针

class ClassB {
public:
    // 定义匹配的指针类型
    myOwnClass* (*my2DArrayPointer)[16];

    // 从ClassA对象获取数组指针
    void bindArray(ClassA& aObj) {
        my2DArrayPointer = aObj.my2DArray;
    }

    // 测试访问数组元素
    void useElement(int row, int col) {
        if (row >= 0 && row < 10 && col >=0 && col <16) {
            // 用法和直接用数组完全一样
            my2DArrayPointer[row][col]->doSomething(); // 假设myOwnClass有doSomething方法
        }
    }
};

为啥myOwnClass***不行?

myOwnClass***对应的是动态分配的二维数组(比如先分配指针数组,再给每个指针分配元素数组),但你现在的是静态固定大小的二维数组,它的内存是连续的整块,类型是“数组的数组”,不是“指针的指针的指针”,类型不匹配自然跑不起来。

简化写法:用typedef降低复杂度

如果觉得那个指针类型太绕,用typedef简化一下:

// 先定义一个类型,表示"16个myOwnClass*的数组"
typedef myOwnClass* MyRowType[16];
// 然后指针就是指向这个类型的指针
MyRowType* my2DArrayPointer;

这样代码可读性高多了,功能和之前完全一致。

内容的提问来源于stack exchange,提问作者Thomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:32:59