当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的地址。