如何在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
相关产品推荐
相关产品推荐

