您的位置:首页 > 其它

type conversion of array and pointer in C(2)

2014-08-18 23:48 369 查看
这两天出去玩了,所以没有写博客,十分惭愧。。。

接上篇内容,上篇讲到了二维数组的类型推导,我们还有一个很重要的地方没有讲,就是函数的传参问题。

归根到底就是:怎么传一个二维数组进函数,怎么在函数中修改传入的数组,怎么在函数中新建一个数组,和怎么返回一个二维数组。

传递参数:

从大类上分,我们可以有以下几种方式传递参数进入函数

直接传递数组,那么函数行参用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;
即可。

至此,有关指针,数组,二维数组的函数传参和返回就讲完了。呼呼~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐