二维数组作形参

二维数组作形参(以二维数组int a[4][3]为例),且在函数调用中可以通过a[i][j]的方式获取二维数组中个各值,可以有两种方式:

1. 使用二维数组作形参
void fun_test2(int ppArr_test[][3]);

void fun_test2(int ppArr_test[4][3])

注:
①二者都是合法而且等价,但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的:
    void fun_test2(int ppArr_test[][])
    
②若采用void fun_test2(int** ppArr_test)这种方式,则函数内不能ppArr_test[i][j]方式获取数组值,会导致编译错误;可采用如下方式进行读值((int)ppArr_test+ n*i + j)。

原因:就在于如果写成ppArr_test[i][j],编译器无法正确的寻址,当然各种编译器对它的处理结果是不一样的。如果我们的形参是数组,那么我们在函数体中可以用指针也可以用数组形式,但是如果我们形参数中用的是指针,最好也用指针,有时用数组形式会出错。

2.使用二维指针作形参
void fun_test1(int (*pArr_test) [3])

注:int (*pArr) [3]定义的数组指针,可以通过直接与数组名相等的方式来指向二维数组。

3. 代码示例

#include <stdio.h>
#include "stdlib.h"

//使用二维数组指针作函数形参 
void fun_test1(int (*pArr_test) [3])
{
    printf("\n\r");
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 3; j++)
        { 
            printf("pArr_test[%d][%d] = %d   ", i, j, pArr_test[i][j]);
        } 
        printf("\n\r");
    } 
}

void fun_test2(int ppArr_test[][3])
{
    printf("\n\r");
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 3; j++)
        { 
            printf("ppArr_test[%d][%d] = %d   ", i, j, ppArr_test[i][j]);
        } 
        printf("\n\r");
    } 
}

int main(void) 
{
    int a[4][3] = {
        {1, 2, 12},
        {3, 4, 34},
        {5, 6, 56},
        {7, 8, 78}};

    int (*pArr) [3];  //一定要加上括号,因为[]的优先级高于*

    pArr = a; //重要!!!!! 

    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 3; j++)
        { 
            printf("pArr[%d][%d] = %d ", i, j, pArr[i][j]);
        } 
        printf("\n\r");
    } 
    printf("\n\r");

    printf("a = %d \n\r", a);
    printf("pArr = %d \n\r", pArr);
    printf("pArr[0] = %d \n\r", pArr[0]);
    printf("&a[0][0] = %d \n\r", &a[0][0]); //以上四个值都是相同的,都可以用来表示二维数组的首地址值 

    fun_test1(pArr);

    printf("\n\r");

    fun_test2(pArr);   

    printf("\n\r");   

    system("pause");
    return 0;
}

注:此代码是在DEV C++环境下运行。

猜你喜欢

转载自blog.csdn.net/u010603798/article/details/78260524