二维数组传参要点

最近在写代码的时候又一次遇到了需要二维数组传参的操作,捣鼓了半天,总是会指针有问题,上网上查阅了相关资料后,虽然弄懂了,但是后面还是把二维改成一维了。但是呢?还是把相关的学习记录整理下来,以防后续还是需要用上。 这里主要以如何声明函数,如何调用函数,在函数中如何使用来讲解。

形参为二维数组

函数声明

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表示第二维数组长度,即列宽 
//其他不被允许。由编译器的寻址方式决定。 

参考链接:[C语言]二维数组传参的格式(详细+总结)_c语言传入二维数组-CSDN博客

posted @ 2024-08-28 22:56  一月一星辰  阅读(40)  评论(0编辑  收藏  举报