C语⾔如何传⼊⼆维数组
C语⾔如何传⼊⼆维数组
咋⼀看,顺⼿就写出下⾯的代码
下⾯就⼀个矩阵的加法演⽰可能出现的问题
void addMatrix(int row,int col,int**a,int**b,int**c){
for(int i =0; i < row; i++){
for(int j =0; j < col; j++){
c[i][j]= a[i][j]+ b[i][j];
}
}
}
int main(int argc,char*argv[])
{
int a[5][1]={1};
int b[5][1]={0};
int c[5][1]={0};
addMatrix(5,1, a, b, c);
return0;
}
很尬杠,编译出错了。错误信息
error: cannot convert ‘int(*)[1]’ to ‘int**’
类型不匹配,为什么出现类型不匹配呢?
那么,int (*)[1]表⽰什么呢?
表⽰只有1列的数组,也就是数组指针,修饰指针的。所以其实是⼀个指向数组的指针,也就是数组的⾏指针
2 修改
机智的你会修改下参数,⽐如将输⼊参数强转int **
addMatrix(5,1,(int**)a,(int**)b,(int**)c);
很遗憾,运⾏错误,这⼜是为什么呢?
我觉得是,把⼆维数组强制转换成int**,让其丢失了数组的列信息,导致使⽤下标的时候出错
具体⽽⾔,就是下标寻址,编译器不知道⼀⾏有多少,也就col未知,因为你已经强转成int**,丢失了数组⼀⾏的个数3 把⼆维数组当成⼀维数组⽤
这⾥的函数形参全是⼀维指针,也就是⼊参的⼀⾏,即a[0]
void addMatrix(int row,int col,int*a,int*b,int*c){
怎么定义二维数组c语言
for(int i =0; i < row; i++){
for(int j =0; j < col; j++){
c[i*col+j]= a[i*col+j]+ b[i*col+j];
}
}
}
int main(int argc,char*argv[])
{
int a[5][1]={1};
int b[5][1]={0};
int c[5][1]={0};
addMatrix(5,1, a[0], b[0], c[0]);
//addMatrix(5, 1, (int *)a, (int *)b, (int *)c);
return0;
}
这样,就需要⼿动计算下下标值i*col+j,其实,本质上讲,这样写效率没区别。因为下标的⽅式也是转成i*col+j,只是下标的⽅式容易理解,如果真要较真的话,可以说下标的⽅式会慢些。
4 其他⽅式
下⾯的⽅式也是可以的,表⽰输⼊的1列的⼆维数组,但是没什么实⽤价值,因为提前不知道有多少列,写成1就只适⽤1列的⼆维数组。当然你也可以使⽤C++的模板推测。
void addMatrix(int row,int col,int(*a)[1],int(*b)[1],int(*c)[1]){
for(int i =0; i < row; i++){
for(int j =0; j < col; j++){
c[i][j]= a[i][j]+ b[i][j];
}
}
}
5 需要传⼊⼆维数组吗?
起初,我感到很纳闷,为什么要传⼊⼆维数组?因为⼆维数组我都是在函数内部new出来的,直接⽤⼆维指针接收的,换句话说,⼆维指针其实⽤于接收函数内部计算的结果。
这样有什么好处呢?
1. 栈⼤⼩有限制,⽆法定义很⼤的⼆维数组
2. 如果把⼆维数组当成⼊参,其实默认是带了⼀个列的信息,否则⽆法适⽤下标,换句话说⼆维指针不带列信息,⽆法进⾏下标运