void fun(char ** p)
{
char (*p1)[10] = (char(*)[10])p;
cout << p1[0];
}
int main(int argc, char* argv[])
{
char data[][10] = {"abc","123"};
fun((char **)data);
}
p的类型在声明形参的时候已经定义为char**了,一旦定义后它的类型是不可改变的,但可以定义另一个具有char [][10]类型的变量,然后把p的值赋予它: char (*p1)[10] = (char(*)[10])p;
这样p1就可以使用p的值,并把p原本指向的对象类型看作char(*)[10]。
如果想把p以二维数组的形式引用,可以如下这么做:
p = (char**)malloc(5*sizeof(char*));
for(i=0; i<=4; ++i) p[i] = (char*)malloc(10*sizeof(char));
这样p就可以用p[i][j]的形式引用了,其中i<5,j<10。这种方法适合于本来没有缓冲区而要新建一个的情况。如果本来已有缓冲区,那么可以如下这么做:
char *p1=....; //假设p1指向原来的缓冲区
p = (char**)malloc(5*sizeof(char*));
for(i=0; i<=4; ++i) p[i]=p1+10*i;
这样p同样可以p[i][j]的方式引用。但是,以上两种方式,虽然p的外部引用方式跟一个二维数组一样,但其类型仍然是char **,而不是char(*)[10]。