C++二维数组传递给函数时形参为指针的用法

当main函数内定义了一个二维数组,其他功能函数想用这个二维数组怎么办?

常用2种办法:

一、二维数组作形参(最简单,好理解)

void output(char a[][4]);
int main(){
	char a[2][4]={"min","you"};            //这里二维中最多只能有3个字符 
	output(a);
	return 0;
} 

void output(char a[][4]){
	int i,j;
	for(i=0;i<2;i++){
		for(j=0;j<4;j++){
			cout<<a[i][j];
		}
		cout<<" ";
	}
}

注意:此处函数形参的定义必须给出第二个维度的大小。

char a[2][4]={"mine","your"}是错误的。定义char数组有2种常用方法:

①char b[3]={'a','b','c'};  此时b数组的长度为3,内容分别为a,b,c。

②char b[3]="ab";此时b数组的长度为3,内容分别为'a','b','\0'。

 

二、用指向一维数组的指针作形参

void output(char a[][4]);
int main(){
	char a[2][4]={"min","you"};            //这里二维中最多只能有3个字符 
	output(a);
	return 0;
} 

void output(char (*p)[4]){
	int i,j;
	for(i=0;i<2;i++){
		cout<<*(p+i)<<" ";
	}
}

我们将二维数组和这个形参指针做个对比:

二维数组:

指针:

所以,利用output(a)就可以将二维数组a[2][4]的首地址传递给函数形参p指针。

那为什么不是output(a[0])?a[0]不也是二维数组的首地址吗?

a存放的是a[0]的地址(a指向a[0]),*a代表a指向对象的内容也就是a[0]的内容,a[0]的内容是a[0][0]的地址(因为a[0]指向a[0][0]),也就是说输出*a相当于输出a[0]整体内容,即输出min。(a+1)存放的是a[1]的地址(a指向a[1]),输出*(a+1)就是输出a[1]整体,即you。

a[0]存放的是a[0][0]的地址,*a[0]代表a[0]指向对象的内容(就是a[0][0]),输出*a[0]的结果为m。(a[0]+1)存放的是a[0][1]的地址,输出*(a[0]+1)就是输出a[0][1],即i。

也就是说,a和a[0]实际上都指向二维数组首元素,但是a[0]只代表数组的一行,a[0]+1是第一行的第二个元素。而a代表的是数组的整体,a实际上代表第一行a[0],a+1是数组的第二行即a[1]。

而在函数形参p的作用就是要每次指向一整行,从图中就可以看出,要想实参形参类型相同,p的值只能是a。*p相当于a[0],存放首元素的地址,p存放*p的地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值