[总结]C语言二维数组作为函数的参数-阿里云开发者社区

开发者社区> anker_rabbit> 正文

[总结]C语言二维数组作为函数的参数

简介:
+关注继续查看

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

复制代码
 1 #include <cstdio>
 2 void print(int *a[3])
 3 {
 4     printf("%d\n",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\n",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('\n');
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 }
复制代码

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
flutter网络dio框架公共请求参数、请求header使用总结
> 本文章将讲述 > 1.get请求中配置公共参数 > 2.post请求配置公共参数 > 3.请求header配置
473 0
Loadrunner中web_find和web_reg_find函数的使用与区别
总结一下Loadrunner中的检查点函数,主要介绍两个函数:web_find()和web_reg_find();这两个函数均用于内容的查找,但两者也有本质的区别,具体介绍如下:一、web_find()函数该函数的作用是“从HTML页面中查找指定的文本字符串”常用参数及含义如下: 1 web_...
860 0
2014秋C++ 第14周项目 二维数组
课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。  【项目1-折腾二维数组】创建一个5行4列的二维整型数组,通过初始化,为数组中的前两列的10个元素赋初值,然后: 通过键盘输入,使后两列的10个元素获得值; 按行序优先输出数组元素; 将所有元素值乘
1282 0
xcode反汇编调试iOS模拟器程序(三)查看Objective-C函数与参数
在Objective-C函数的入口处(第一行)加断点,可用esp指针来探查参数。 以esp为基址,往后的偏移分别是: 0:函数执行完毕后的返回地址(不是返回值的地址哦) 4:对象实例的指针,即self指针 8:selector,实际是一个...
973 0
2014秋C++第14周项目1参考-折腾二维数组
课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。  【项目1-折腾二维数组】创建一个5行4列的二维整型数组,通过初始化,为数组中的前两列的10个元素赋初值,然后: 通过键盘输入,使后两列的10个元素获得值; 按行序优先输出数组元素; 将所有元素值
988 0
Java基础-10总结形式参数,包,修饰符,内部类
你需要的是什么,直接评论留言。 获取更多资源加微信公众号“Java帮帮” (是公众号,不是微信好友哦) 还有“Java帮帮”今日头条号,技术文章与新闻,每日更新,欢迎阅读 学习交流请加Java帮帮交流QQ群553841695 分享是一种美德,分享更快乐! 类,抽象类,接口的综合小练习 /* 教练和运动员案例(学生分析然后讲解
1135 0
C# 扩展方法 白话总结
我们在变成的时候时常遇到这样的问题,new了一个系统内的对象之后,我们想要对该对象有一个方法可是却点不出来,说明该对象本身没有声明该方法,可是微软又不允许我们去该对象的代码,怎么办? 在C# 3.
774 0
+关注
103
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载