为什么类型转换中把指针转换为二维数组时,编译器提示“必须输入常量值”?

为什么类型转换中把指针转换为二维数组时,编译器提示“必须输入常量值”?

比如:((int (*)[3])(A))[1][1]正常,可是((int (*)[n])(A))[1][1]就提示:
error C2057: 应输入常量表达式
error C2466: 不能分配常量大小为 0 的数组
error C2036: “int (*)[]”: 未知的大小

可是这是程序设计需要,需要用户输入来动态决定二维数组的列数,A是一个内存块的首地址指针变量

内存是线性的,它只有一维。
多维数组只是概念上的意义,编译器会把它转换成一维的
多维数组怎么实现呢

int a[3][4];
a[1][0]的地址怎么确定呢,其实就是a(数组首地址)+4(列的个数)*1(行的个数)+0(列数)
a[2][0]就是a+4*2+0
如果我们不定义具体的列的个数,那么编译器就不知道第二行的起始地址是什么了,当然编译器也就无法转换数组地址了
如果是动态决定,那么就不能用编译器来转换你的数组了,你只好自己添加代码来实现

int a[100];
n等于10时,a[][10]
那么a[1][0]的地址就是a+1*10+0 也就是a+1*n+0
a[2][0] <=> a+2*n+0
多维数组也是一样,这只是一些不同的映射方式~
把多维映射成一维
就如我们需要一张方形的纸,可是手里只有一条细长的纸条
我们就把纸条栽几段相同的长度拼在一起,这样就得到了一张方形纸~
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-01-24
不支持动态的啊,下面的代码可能对你有帮助:
int m,n;//n行,m列,每一行的列数可能不同。
int **a;
int *p,**pp;
int *flag;
cin>>n;//用户输入n的值
a=(int **)calloc(n,sizeof(int*));//开辟n个存储指针的内存,a为指针的指针
flag=(int*)calloc(n,sizeof(int));
memset(flag,0,n);
for(pp=a;pp<a+n;pp++)//遍历每一行
{
cin>>m;//用户输入m,不同行,m的值可能不同
*pp=(int*)calloc(m,sizeof(int));//开辟m个存放整型数据的内存空间
memset(*pp,0,m);
for(p=*pp;p<*pp+m;p++)//对这些整型数据遍历访问
{
cin>>*p;
}
sort(*pp,m);//对数据排序
for(p=*pp+1;p<*pp+m-1;p++)
{
if(*p+*p!=*(p-1)+*(p+1))
{
flag[pp-a]=1;
p=*pp+m-1;//退出此次循环
}
}
free(*pp);
}
free(flag);
free(a);
第2个回答  2011-01-24
用动态开辟内存试试.C语言是malloc函数,C++好像是用new关键字
相似回答