zoukankan      html  css  js  c++  java
  • C语言二维数组作为函数参数

    设有整型二维数组a[3][4]如下:
    0   1   2   3
    4   5   6   7
    8   9  10  11 
    它的定义为:
        int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}
    设数组a的首地址为1000,各下标变量的首地址及其值如图所示。


    前面介绍过,C语言允许把一个二维数组分解为多个一维数组来处理。因此数组a可分解为三个一维数组,即a[0]、a[1]、a[2]。每一个一维数组又含有四个元素。



    例如a[0]数组,含有a[0][0],a[0][1],a[0][2],a[0][3]四个元素。

    更多的见: http://c.biancheng.net/cpp/html/79.html


    数组及数组元素的地址表示如下:从二维数组的角度来看,a是二维数组名,a代表整个二维数组的首地址,也是二维数组0行的首地址,等于1000。a+1代表第一行的首地址,等于1008。如图:

     

     

    int array[3][3];

    array的类型既不是int **

    更不是(int *a)[4]

    而是int [3][3]

    只是作为右值时才转换成

    int (*a)[4] a是指向一个有4个元素的数组的指针,事实上这个a此时指向a[0],指向数组,就是说a里保存着数组的地址,就是1000

    指针数组与数组指针

    指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针

    数组指针:a pointer to an array,即指向数组的指针

    还要注意的是他们用法的区别,下面举例说明。

    int* a[4]     指针数组     

                     表示:数组a中的元素都为int型指针    

                     元素表示:*a[i]   *(a[i])是一样的,因为[]优先级高于*

    int (*a)[4]   数组指针     

                     表示:指向数组a的指针

                     元素表示:(*a)[i]  

    #include <iostream>

    using namespace std;

     

    int main()

    {

    int c[4]={1,2,3,4};

    int *a[4]; //指针数组

    int (*b)[4]; //数组指针

    b=&c;

    //将数组c中元素赋给数组a

    for(int i=0;i<4;i++)

    {

    a[i]=&c[i];

    }

    //输出看下结果

    cout<<*a[1]<<endl; //输出2就对

    cout<<(*b)[2]<<endl; //输出3就对

    return 0;

    }

    (int *array)[N] 和int **的区别

    Int ** p,就是一个指针,这个指针指向了int* 也就是一个整型数组,p是指向了整数数组的指针,p中是整数数组的地址,(int *array)[N] 和int **的区别就在于每行的元素个数固不固定

    传递二维数组参数

    int func(int **array, int m, int n) {

    ...

    printf(" %d", *(*array +i*n +j));

    ...

    }

     

    int main() {

      int array[3][3] = {

    {1,2,3},

    {4,5,6},

    {7,8,9}

    };

    ...

    func(array,3,3);

     ...

    }

    这样传递二维数组是错的,因为类型不匹配,是因为数组实际类型是int [3][3],在作为右值时可以被转化为int (*)[3],它们都和int **不同,自然不可用。

     

    法一 直接使用数组类型:因为数组实际类型是int [3][3]

    可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,如:

     

    void Func(int array[3][10]);

     

    void Func(int array[][10]);

     

    二者都是合法而且等价,但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的:

     

    void Func(int array[][]);

     

    因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放),而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多 少列,不能只指定一维而不指定第二维

     

    法二.一维数组指针作为形参

    void func2(int (*pArray)[10])

    {

     

    }

     

    void func2_1(int (*pArray)[]) //编译通过,无法调用

    {

     

    }

     

    int main()

    {

    int array[10][10];

    func2(array);

    }

    把array[0] 数组的指针传给了func2 因为array是指向10个元素的数组的指针,(*array)就是array[0],(*array)[0] 就是array[0][0]

     

    法三.二维数组引用作为形参

    void func3(int (&pArray)[10][10])

    {

     

    }

     

    int main()

    {

    int array[10][10];

    func3(array);

    }

    以下是一维数组引用的例子

     

    #include <iostream>

    using namespace std;

    void output(int (&a)[5])

    {

    for(int i = 0; i < 5; i++)

    cout<<a[i]<<endl;

    }

    int main()

    {

    int a[5]={0};

    output(a);

    getchar();

    return 0;

    }

     

    法四。二维数组指针作为形参

    void func4(int (*pArray)[10][10])

    {

     

    }

     

    int main()

    {

    int array[10][10];

    func4(&array);

     

    }

  • 相关阅读:
    「Vijos 1282」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔法照片
    「Vijos 1285」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔法药水
    「Vijos 1284」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔法阵
    「Vijos 1283」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔杖
    「2018-12-02模拟赛」T3 约束排列 解题报告
    「2018-12-02模拟赛」T2 种树 解题报告
    「2018-12-02模拟赛」T1 最短路 解题报告
    「分块系列」公主的朋友 解题报告
    「分块系列」「洛谷P4168 [Violet]」蒲公英 解题报告
    Java高级架构师(一)第03节:多模块多Web应用合并War包
  • 原文地址:https://www.cnblogs.com/unflynaomi/p/6516766.html
Copyright © 2011-2022 走看看