
{
void MatrixChain(int *p,int n,int **m,int **s); //函数,代码忽略
void Traceback(int i,int j,int **s) ; //函数,代码忽略
int p[7]={30,35,15,5,10,20,25};
int n=6,m[6][6],s[6][6];
MatrixChain(p,n,m,s);
Traceback(1,n,s);
return 0;
}
指向指针的指针不是可以表示二维数组么?为什么传二维数组给**m 报错?
int b[3][2]={23,3,45,34,45,6};
int **t;
t=b;
我单独这样写也错,,哪位高人讲解一下!
MatrixChain(p,n,m,s);
我是想把一个二维数组作为参数传进一个函数。
形参是**m, 实参是 二维数组m[ ][ ] , 但这样报错。
【重点是传二维参数的问题,->有解决方法么・,谢谢!!】
这说明你对指针理解还不够透彻。
int **t;
还没有分配内存能拿来t = b么?
这散瞎个先不说,
b[3][2]是2维的数组,所以
int b[3][2]={{1,2},{1,2},{1,3}};
不仅自己方便辨认也对你的代码清晰有好处
至于你函数的传值,我不需要看你的函数就知道不行
因为b[3][2]这样的数组,可以看成3行和2列,也可以看成
3个指向2维数组的指针
但是函数传值的时候编译器可以figure out数组前面的那一维,但是不能知道后面那一组的大小,所以你要明确指明后面的大小,所以prototype里要写
int m[][a],a是一个值
至于内存分配,比如
我写个
int *i, a;
a = 10;
*i = a;
这个对么?明显不对,因为i是指针,没有分配过内存
我不是中文学的,所以表述有点不清,但是malloc和指针是比较有难度的,慢慢来
还有楼上那位兄弟写的挺好,这里提醒一下需要注意int *t[n]和int (*t)[n]相差甚远,所以留心。
今天看了一下发现俺对你的意思理解有点偏差,不好意思,
“指向指针的指针不是可轿掘团以表示二维数组么?为什么传二维数组给**m 报错?”
指向指针的指针可以表示二闭橘维数组,前提是你要先分配内存.
比如
int **t;
t = (int **)malloc(3*sizeof(int *));
这样t就是一个含有3个指针的数组,
然后你再单独对每一个指针分配内存:
int i;
for(i = 0; i < 3; i++){
t[i] = (int *)malloc(2*sizeof(int));
}
这样t才可以看做二维数组,
而单单的int **t仅仅是指向一个指向整数的指针。
所以你可以写
int **t, *ptr, a;
a = 10;
ptr = &a;
t = &ptr;
但是不能直接用作函数原型里作为2维数组传值的形参。
函数原型里要写作
void MatrixChain(int *p,int n,int m[][6],int s[][6]);
这样传值才是对的,原因参见我前面讲的
这个就是解决方法
int b[3][2]={23,3,45,34,45,6};
int (*t)[2];
t=b;
这样就行了,b的实质是一个指向一个数组(这个数组有两个元素)的指针,
所以 int (*t)[2];也定义了一个指向一个数组(这个数组有两个元素)的指针
对于 int a[10];,其第一个数组元素 a[0] 的类型是 int(其实每个元素的类型都相同),那么此数组对象可以转换为指向 int 的指含氏针,其类型是 int*。
二维数组可以看作是一维数组,其每个数组元素又是一个一维数组。因此,对于 int b[4][6];,其数组元素 的类型是 int[6],所以指针的类型是 int(*)[6](注意不是 int**)。对于三维及以上数组可进行同样分析。
给个传参数的例子:
int a[2][4];
调用:prt(a);
void prt(int (*p)[4])
{
int i ,j;
for(i =0;i<3;i++)
{
for(j =0;j<4;j++)
{
printf("%d ",p[i][j]);
}
printf("\n");
}
}
我是想把一个二维数组作为侍睁参谈谈散数传进一个函数。
形参是**m, 实参是 二维数组m[ ][N ] , 但这样报错。
当然报错啊,m是指向指针的指针,而m是一个指向一个数组(这个数组有N个元素)的指针