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

      前言:今天在实现装配线调度程序时候,用到了二维数组,并将其作为函数的参数。在写程序的时候,遇到一些问题,即二维数组做函数的参数应该如何正确表示。我写程序的错误如下程序所示:

    复制代码
     1 #include <cstdio>
     2 void print(int *a[3])
     3 {
     4     printf("%d
    ",a[0][0]);
     5 }
     6 
     7 int main()
     8 {
     9     int a[2][3] = {1,2,3,4,5,6};
    10     print(a);
    11     return 0;
    12 }
    复制代码

    编译程序时候,在第10行提示错误信息:|10|error: cannot convert 'int (*)[3]' to 'int**' for argument '1' to 'void print(int**)'|。根据错误提示我明白了,   int *a[3]表示一个一维数组,数组的数据类型为整型指针(int*),数组的大小为3,这是因为[]的优先级高于*的优先级。如是我将程序改写如下,顺利通过编译,得到正确结果。

    复制代码
     1 #include <cstdio>
     2 void print(int (*a)[3])     //用括号将指针括起来
     3 {
     4     printf("%d
    ",a[0][0]);
     5 }
     6 
     7 int main()
     8 {
     9     int a[2][3] = {1,2,3,4,5,6};
    10     print(a);
    11     return 0;
    12 }
    复制代码

    下面来总结一下二维数组作为函数参数该如何表示。

    1、二维数组的概念

      在C语言中,二维数组实际上是一种特殊的一维数组,它的每个元素也是一个一维数组。因此,二维数组下标形式正确写法如下:int arrays[i][j]。数组元素是按照行顺序存储的,因此当按存储顺序访问树时,最右边的数组下标(列)变化的最快。

    2、二维数组作为函数参数

      规定:如果将二维数组作为参数传递给函数,那么在函数的参数声明中必须指明数组的列数,数组的行数没有太大关系,可以指定也可以不指定。因为函数调用时传递的是一个指针,它指向由行向量够成的一维数组。因此二维数组作为函数参数正确写法如下所示:   

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

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

    因为数组的行数无关紧要,所以还可以写成如下形式:

    void Func(int (*array)[10]);  注意*array需要用括号括起来。

    这种形式的声明参数是一个指针,它指向具有10个元素的一维数组。因为[]的优先级比*的优先级高,故*array必须用括号括起来,否则变成了

    void Func(int *array[10]);

    这时候参数相当于是声明了一个数组,该数组有10个元素,其中每个元素都是一个指向整型对象的指针。

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

     void Func(int array[ ][ ]);

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

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

      实参数组维数可以大于形参数组,例如形参数组定义为: 

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

    而实参数组定义为:int array[5][10];     进行函数调用Func(array)时,由于数组在内存中是连续存放的,虽然形参与实参数组行数不对应,但是列数是相同的,具有相同的起始地址,这样可以访问到后续的值。如下述程序:

    复制代码
     1 #include <stdio.h>
     2 
     3 void print_array(int *array, int len)
     4 {
     5     int i = 0;
     6     for ( ; i < len; i++) {
     7         printf("%d ",array[i]);
     8     }
     9     putchar('
    ');
    10 }
    11 
    12 void func(int array[3][10])
    13 {
    14     print_array(array[0], 10);
    15     print_array(array[1], 10);
    16     print_array(array[2], 10);
    17     print_array(array[3], 10);
    18     print_array(array[4], 10);
    19 }
    20 
    21 int main()
    22 {
    23     int array[5][10] = {
    24         {0,1,2,3,4,5,6,7,8,9},
    25         {10,11,12,13,14,15,16,17,18,19},
    26         {20,21,22,23,24,25,26,27,28,29},
    27         {30,31,32,33,34,35,36,37,38,39},
    28         {40,41,42,43,44,45,46,47,48,49}
    29     };
    30     func(array);
    31     return 0;
    32 }
    复制代码

     参考资料:

    1、http://www.cnblogs.com/yangxi/archive/2012/03/22/2411452.html

    2、K&R《C语言程序设计》第二版P95-P97

  • 相关阅读:
    现代软件工程 第一章 概论 第3题——韩婧
    现代软件工程 第一章 概论 第2题——韩婧
    小组成员邓琨、白文俊、张星星、韩婧
    UVa 10892 LCM的个数 (GCD和LCM 质因数分解)
    UVa 10780 幂和阶乘 求n!中某个因子的个数
    UVa 11859 除法游戏(Nim游戏,质因子)
    Codeforces 703C Chris and Road 二分、思考
    Codeforces 703D Mishka and Interesting sum 树状数组
    hdu 5795 A Simple Nim SG函数(多校)
    hdu 5793 A Boring Question 推公式(多校)
  • 原文地址:https://www.cnblogs.com/alantu2018/p/8465894.html
Copyright © 2011-2022 走看看