c++ - 动态内存分配和指针非字符数组类型

标签 c++ arrays pointers

我读了这个C++ tutorial , 在指针部分有一个令人困惑的例子,就是这样:

double (*pVal2)[2]= new double[2][2]; //this will add 2x2 memory blocks to type double pointer
*(*(pVal2+0)+0) = 10;
*(*(pVal2+0)+1) = 10;
*(*(pVal2+0)+2) = 10;
*(*(pVal2+0)+3) = 10;
*(*(pVal2+0)+4) = 10;
*(*(pVal2+1)+0) = 10;
*(*(pVal2+1)+1) = 10;
*(*(pVal2+1)+2) = 10;
*(*(pVal2+1)+3) = 10;
*(*(pVal2+1)+4) = 10;

int (*pVal)[2] 是数组指针吗? 我不明白为什么它为 double[2][2] 分配内存,但 *(*pVal2+1)+4) 变为 4?

最佳答案

使用螺旋法则:

        +--------+
        | +---+  |
        | ^   |  |
double (*pVal2)[2];
 ^      ^     |  |
 |      +-----+  |
 +---------------+

pVal2 是指向 2 个 double 数组的指针。或者,更简单:

using T = double[2];
T *pVal2 = new T[2];

其余代码会导致未定义的行为:*(p + idx) 等同于 p[idx],因此 *(*( pVal2+1)+4) 等同于pVal2[1][4]。但是pVal2[1] 的类型是double[ 2],所以那里没有第 5 个元素...

关于c++ - 动态内存分配和指针非字符数组类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32514715/

相关文章:

c++ - Visual C++ 窗口创建失败

c++ - 如何使用 shared_ptr 避免悬挂指针?

javascript - 二维中点分割逻辑

java - 如何将数组转换为 Java 中的表?

c - 使用 strtok() 进行 token 识别

c++ - 返回 vector 元素 C++ 的地址

C++ 模板包推导——我在这个例子中做错了什么?

c++ - 模板元编程经验法则

Java 从另一个类调用数组

c++ - 将数组转换为函数返回中的指针