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);

     

    }

  • 相关阅读:
    002. 在HTML页面嵌入循环代码
    001. 为input type=text 时设置默认值
    PHP包名解释
    003. vs2010发布、打包安装程序(转)
    SQL server 2008 Express Edition实现自动备份和自动删除备份
    解决phpMyAdmin中缺少mysqli扩展的错误
    IIS6下PHP环境的资源未找到(404)问题
    解决远程桌面连接过去后是蓝色屏幕问题
    解决tomcat一闪而过问题
    解决访问远程共享时发生 请检查名称的拼写. 否则, 网络可能有问题 故障
  • 原文地址:https://www.cnblogs.com/unflynaomi/p/6516766.html
Copyright © 2011-2022 走看看