【C语言向函数传递二维数组】【一维数组与二维数组的指针传递】

1.以二维数组的形式传递

但是只给出第一维度,第二维度作为参数传递

void function(int a[][3], int maxrow){
	int i,j;
	for(i=0;i<maxrow;i++){
		for(j=0;j<3;j++){
			printf("%d",a[i][j]);
			printf("%d",*(*(a+i)+j));
			printf("%d",*(a[i]+j));
			printf("%d",*((int*)a+i*3+j));
		}
	}
}

2.传递一个数组指针

即传递行指针,附带一维维度,参数传递为二维维度

数组指针:指针,指向一个数组

指针数组:数组,数组里的元素都是指针int *a[3] -> (int *)a[3]

这里多说下行指针和列指针

行指针:指向一维数组,也就是二维数组中每一行的首地址(如p=a[0])

列指针:指向数组中具体的某个元素,如p=&a[0][2]

再说下传递二维数组行指针和一维数组的区别

一维数组传递方式:

void function(int a[],int size); //或int a[10]

void function(int *a);

这里传递的是一个int类型的指针,指向的是数组的首地址,但本质还是指向一个int的数

所以我们传递的不是一整个数组,而是该数组的首地址,我们通过移动指针来访问数组,二维数组也是一样,只不过是一行一行的移动

void function(int (*a)[3])

这里传递的是一个指向有三个元素的一个数组的指针,该指针里的地址是二维数组的首地址,而数组里的每个元素都是int型的

为什么要传一个列数而不是传递行数呢,我一开始一度以为void function(int (*a)[3])里面的3是行数,但是是列数,可以这样理解,我们知道指针运算是以该指针的类型所占字节为移动单位的,而对于一个二维数组在计算机中是一行一行的存的,我们对a[0]+1得到的就能是第二行的首地址,移动了三个int单位,就是给出的列数

void function(int (*a)[3],int maxrow){
	int i,j;
	for(i=0;i<maxrow;i++){
		for(j=0;j<3;j++){
			printf("%d",a[i][j]);
			printf("%d",*(*(a+i)+j));
			printf("%d",*(a[i]+j));
			printf("%d",*((int*)a+i*3+j));
		}
	}
}

3.传递指针的指针

可以不给出列数,但是一定要给出行数

void function(int **a,int maxrow){
	int i,j;
	for(i=0;i<maxrow;i++){
		for(j=0;j<maxcol;j++){
			printf("%d",*((int*)a+i*maxcol+j));
		}
	}
}

计算数组行数与列数公式如下:

maxrow=sizeof(a)/sizeof(a[0]);
maxcol=sizeof(a[0])/sizeof(a[0][0]);
  • 13
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值