C++中用new为二级指针分配空间的问题

C++中,为一级指针分配10*10的空间可以使用如下语法:
INT *ptr;
ptr = new INT[10][10]; 或 ptr = new INT[10 * 10];

但对于二级指针来说,我要为二级指针分配一段空间(也就是指针数组),为什么只能用下面这种语法:
INT **ptr;
ptr = new INT* [10 * 10];

而不能用下面这种语法(这种语法编译出错):
INT **ptr;
ptr = new INT* [10][10];

请高人指教,多谢了~~~
首先补充一下:在VC环境下编译
另外,我重点想问的是:一级指针可以用单个或多个个相邻的中括号来表示申请元素的个数,而二级指针只能用一个中括号(而不能用多个相邻的中括号)来表示申请的元素个数

谢谢大家的回答,sunyaiqq直接地解决了我的问题,fuchuangbob的说明很详细,其它几位也很热心,谢谢,只是只能选一个答案,多少有点遗憾啊,呵呵

首先一级指针
INT *ptr;
ptr = new INT[10][10]; 这句就是错的,编译不过去,所以也就解决你的疑问了。无论1级还是2级指针都不能中括号相邻分配。
其次
INT **ptr;
ptr = new INT* [10 * 10]; 这句是指分配了100个int指针,并不是一个10*10的2维数组。如果分配一个2维数组必须
int **ptr = new int *[10];
for(int i=0;i<10;i++)
{
ptr[i]=new int[10];
}
希望你看懂了!!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-09-05
INT *ptr;
ptr = new INT[10][10];
会编译错误。
(错误: 不能将‘int (*)[10]’转换为‘int*’,在 assignment 中)
ptr声明为指向一个INT型的,但是实际指向的却是int(*)[10]型。
第2个回答  2008-09-05
INT[10 * 10];我觉得大概和INT[100]没两样
第3个回答  2008-09-05
int(*)[2]表示的是数组大小为2的数组的指针,int *是一个int整数的指针,你将这两个赋值当然出错。
你所说的ptr = new INT[10][10]; 这句是不可能编译地去的,因为int[10][10]的类型就int(*)[]。同时要弄清楚一个问题就是,int*[]与int(*)[]是不同的,int* []的意思是分配一段内存,内存里面数据类型是int*,即指针类型;而int(*)[]就是一个指针,一个指向后面综括号里那么大一段内存的指针(其实就是那段内存的第一个元素的地址)
如果你用malloc就会更清晰了,int **ptr=(int **)malloc(a*sizeof(int *));
然后
for(i=0;i<a;i++)
*p=(int *)malloc(b*sizeof(int));
这样的结果就相当一个数组ptr[a][b]了,当然这是动态的。
第4个回答  2008-09-05
//---------------------------------------------------------------------------
#include <iostream>

int main(void)
{
int **p;
int i,j;
p=new int*[10];/*注意这里*/
for (i = 0; i < 10; i++) {
p[i]=new int[10];/*注意这里*/
}
for (i = 0; i < 10; i++) {
for (j=0; j<10; ++j) {
p[i][j]=i*j;
std::cout<<p[i][j]<<'\t';
}
std::cout<<std::endl;
delete[] p[i];
}
delete[] p;
return 0;

}
//---------------------------------------------------------------------------
相似回答