让人蒙圈的二维数组传参,碰到了,记录下。
其实声明,定义是一样的。因此,只写声明。
同时,把元素外层*()剥去就代表地址。因此只写元素。
最后有总结。
二维数组作函数参数,依我看来,至少可以分成三种。
事先,在main函数中 int a[m][n];
好了,进入主题。
第一种形参为二维数组
声明:
void function(int a[m][n]);//函数声明
void function(int a[][n]);//不论多少维数组,第一维都可省略。
//凭什么,第二维就不可省略呢?由编译器的寻址方式决定。
调用:
function(a);//函数调用 实参直接写数组名!数组名!(重点)。
//(注意)function(a[m][n])或function(a[][n])都不可以!
//话说,写数组名多好,简单轻松。
操作元素:
*(a[i] + j) //代表第 i 行 第 j 列
*(*(a+i) + j) //同上
*((int *)a +i*n +j )//同上,n表示第二维数组长度,即列宽
//不管怎么样,a[i][j]不被允许。也是由编译器的寻址方式决定。
第二种形参为数组指针
(其实只是 声明定义 与第一种不同,其他一样)
声明:
void function(int (*a)[n]);
//不是(int *a[n])(指针数组) ,而是(int (*a)[n])(数组指针);
// 缘由是 [] 的 优先级比 *的大
调用:
function(a);//函数调用 实参同样直接写数组名!
//(注意)function(a[m][n])或function(a[][n])同样都不可以!
操作元素:
*(a[i] + j) //代表第 i 行 第 j 列
*(*(a+i) + j) //同上
*((int *)a +i*n +j )//同上,n表示第二维数组长度,即列宽
//a[i][j]不被允许。由编译器的寻址方式决定。
第三种形参为二级指针
声明:
void function(int **a,int n);
//n表示第二维数组长度,即列宽
调用:
function( (int **)a,int n);//实参不能为数组名!*与上面相反*!有两个 * !
//(注意)function(a)或function((int *)a)不可以!
操作元素:
*((int *)a +i*n +j )//只有一种!n表示第二维数组长度,即列宽
//其他不被允许。由编译器的寻址方式决定。
总结
声明定义(分三种)。
二维数组,数组指针,二级指针。(都是指针)调用(一对一,二对二)
数组指针,二维数组就写一级指针即 数组名.二级指针就写二级指针即 (int**)数组名
在函数中操作元素(注意二级指针,只能用最后的方法)
*(a[i] + j) //代表第 i 行 第 j 列 *( *(a+i) + j) //同上 *( (int * )a +i * n +j )//n表示第二维数组长度(列宽) 也就是说 3. 是万能。声明,定义是一样的。
同时,把元素外层()剥去就代表地址。
部分内容转载自 CSDN https://blog.csdn.net/qq_43868654/article/details/84641383
发表评论