破译这样的陈述的一个好技巧是逐步进行并建立
这是一个双打数组
double array[5];
array 也是一个指针,所以这是相同的(但是第一个已知大小为 5,第二个它可以指向任何数字)
double *array;
`
现在让我们尝试一些更通用的东西
T *a;
是指向一个或多个 Ts 的指针,所以T a[x];
x 是一个数字
这里建立T **a;
的 a 是一个指向一个或多个指向一个或多个 Ts 的指针
这意味着它*a
是一个指向一个或多个 T 的指针以及类似的东西
*a = new T[5]
是有效的,但a = new T[5]
不是正确的,它会a= new T*[5]
创建 5 个指向 Ts 的指针
所以回到你原来的例子int ** arr[10];
,这里 arr 指向一个 10 int ** 的静态数组,这意味着arr[0] = new int*[5]
是一个有效的语句,以下是有效的 C++
int ** arr[10];
arr[0] = new int*[5];
arr[0][1] = new int[5];
arr[0][1][0] = 4;
std::cout << arr[0][1][0] << std::endl; // prints 4
delete [] arr[0][1];
delete [] arr[0];
//note that arr doesn't need to be deleted as it wasn't dynamically allocated