type conversion of array and pointer in C(2)

这两天出去玩了,所以没有写博客,十分惭愧。。。

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

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

传递参数:

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

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

至此,有关指针,数组,二维数组的函数传参和返回就讲完了。呼呼~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值