这两天出去玩了,所以没有写博客,十分惭愧。。。
接上篇内容,上篇讲到了二维数组的类型推导,我们还有一个很重要的地方没有讲,就是函数的传参问题。
归根到底就是:怎么传一个二维数组进函数,怎么在函数中修改传入的数组,怎么在函数中新建一个数组,和怎么返回一个二维数组。
传递参数:
从大类上分,我们可以有以下几种方式传递参数进入函数
直接传递数组,那么函数行参用int a[][],另外需要传数组的行和列进函数。
如果只传数组的首地址进函数,那么有以下2种传法
1. 传int * 型指向数组首地址的指针p,这种时候编译器对p+1翻译为地址加4.
2. 传(int *)[2]型指针指向数组第一行首地址的指针p,这种时候p+1翻译为+8,*p+1翻译为+4.
请看示例代码:
#include <stdio.h>
void f1(int a[][2], int row, int col){//n维数组的行参除了第一维可以不写明,其它维都要显式的写出
for (int i =0; i<row; i++){
for(int j = 0; j < col; j++){
printf("%d",a[i][j]);
}
}
printf("\n");
}
void f2(int (*p)[2], int row, int col){//n维数组的行参除了第一维可以不写明,其它维都要显式的写出
for (int i = 0; i < row*col; i ++) {
printf("%d",*(*p+i));
}
printf("\n");
}
void f3(int *p, int row, int col){
for (int i = 0; i < row*col; i ++) printf("%d",*(p++));
printf("\n");
}
int main(){
int a[3][2] = {1,2,3,4,5,6};
f1(a,3,2);
int (*p)[2] = a;
f2(p,3,2);
int *q = &a[0][0]; //也可以是int *q = *p; int *q = a[0];
f3(q,3,2);
}
结果:
以上3种方式都能在函数中修改数组内容
接下来是在函数中new一个二维数组:
#include <stdio.h>
int ** f(int row, int col){
int temp = 1;
int ** p = new int *[row];
for (int i =0; i<row; i++){
p[i] = new int[col];
}
for (int i =0; i<row; i++){
for(int j = 0; j < col; j++){
p[i][j] = temp++;
}
}
return p;
}
int main(){
int ** p = f(3,2);
for (int i =0; i<3; i++){
for(int j = 0; j < 2; j++){
printf("%d", p[i][j]);
}
}
printf("\n");
for(int i=0;i<2;i++) delete [] p[i];
delete [] p;
}
最后是返回一个数组,事实上,上面已经展示了返回一个数组的一种方式,但这仅用于在函数里new的二维数组返回,因为一般而言,不是new的数组都不能够用int**来指向。
假如说我要返回一个不是在函数里new的二维数组。那么我只有一种返回方式,就是int*,用于保存需要返回的数组的首地址。这样,我们就有了第二种创建二维数组并返回的方法,即new一个一维数组,然后当二维数组来用。
<pre name="code" class="cpp">int* f(){
int *temp = new int[4];
return temp;
}
或者如果是返回一个修改过的传入的二维数组,只需要在函数最后加上
int *p = &a[0][0]
return p;
或者
int *p = a[0]
return p;
即可。
至此,有关指针,数组,二维数组的函数传参和返回就讲完了。呼呼~