能否向函数传递一个数组?
例:
void fun(char a[10]) 

   char c = a[3]; 
}

int main()

   char b[10] = “abcdefg”;
   fun(b[10]); return 0;
 }

答案:
(1)先看上面的调用,fun(b[10]);将b[10]这个数组传递到fun 函数。但这样正确吗?b[10]是代表一个数组吗? 显然不是,我们知道b[0]代表是数组的一个元素,那b[10]又何尝不是呢?只不过这里数组越界了,这个b[10]并不存在。但在编译阶段,编译器并不会真正计算b[10]的地址并取值,所以在编译的时候编译器并不认为这样有错误。虽然没有错误,但是编译器仍然给出了两个警告: 
warning C4047: 'function' : 'char *' differs in levels of indirection from 'char ' 
warning C4024: 'fun' : different types for formal and actual parameter 1 
这两个警告告诉我们,函数参数需要的是一个char*类型的参数,而实际参数为char 类型,不匹配。虽然编译器没有给出错误,但是这样运行肯定会有问题。

(2)b[10]并不存在,在编译的时候由于没有去实际地址取值,所以没有出错,但是在运行时,将计算b[10]的实际地址,并且取值。这时候发生越界错误。

(3)编译器的警告已经告诉我们编译器需要的是一个char*类型的参数,而传递过去的是一个char 类型的参数,这时候fun 函数会将传入的char 类型的数据当地址处理,同样会发生错误。

(4)为什么编译器告诉我们它需要的是一个char*类型的参数?C 语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元素首地址的指针。这么做是有原因的。在C 语言中,所有非数组形式的数据实参均以传值形式调用,然而,如果要拷贝整个数组,无论在空间上还是在时间上,其开销都是非常大的。更重要的是,在绝大部分情况下,你其实并不需要整个数组的拷贝,你只想告诉函数在那一刻对哪个特定的数组感兴趣。这样的话,为了节省时间和空间,提高程序运行的效率,于是就有了上述的规则。所以说:说函数的参数是一个char*类型的指针。

(5)同样的,函数的返回值也不能是一个数组,而只能是指针。这里要明确的一个概念就是:函数本身是没有类型的,只有函数的返回值才有类型。

我们完全可以把fun 函数改写成下面3种形式:
形式一:
void fun(char *p) 

char c = p[3]; //或者是char c = *(p+3);
}

形式二:
void fun(char a[10]) 

char c = a[3]; 
}

int main() 

char b[100] = “abcdefg”;
fun(b); 
return 0; 
}

形式三:
void fun(char a[ ]) 

char c = a[3]; 
}
改写成这样或许比较好,至少不会让人误会成只能传递一个10 个元素的数组。

能否向函数传递一个数组?相关推荐

  1. 向函数传递一维数组和已知大小的二维数组

    一维数组 在C语言中,向函数传递参数只有一种形式--值传递.不管是传递一个整型变量,还是传递一个指针,函数得到的都只是实参的拷贝值. 先定义一个一维整型数组: int a[] = { 0, 1, 2, ...

  2. c++函数返回一个数组

    https://www.cnblogs.com/walter-xh/p/6192800.html ---恢复内容开始--- 调用某个函数时经常需要函数返回一个值,我们都知道c++ 的函数返回的是一个c ...

  3. c语言函数将如何返数组,声明一个C函数返回一个数组

    有几点要指出. 首先,您不能像在这里那样分配数组对象: char A[WIDTH][HEIGHT]; A=rand_grid(WIDTH,HEIGHT); 数组类型的对象不可修改. 其次,C语言中的函 ...

  4. php创建数组教程,PHP中使用array函数新建一个数组

    PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合 ...

  5. C语言,向函数传递一维数组,计算最高分,平均分,人数(要求输入负值时输入结束,且不能超过40人)

    声明:该编译器为vs,所以输入函数写为scanf_s形式! 代码如下: #include <stdio.h> #define N 40 int ReadScore(int score[]) ...

  6. C语言,向函数传递一维数组,调用函数并计算平均成绩

    代码如下: 说明:编译器为vs,所以使用的是scanf_s #include <stdio.h> #define N 40 int Average(int score[], int n); ...

  7. php 闭包传参_php如何给函数传递一个闭包函数参数?

    class Di { private $factory; public function set($id, $value) { $this->factory[$id] = $value; } p ...

  8. python open函数encoding_python 读不同编码的文本,传递一个可选的encoding 参数给open() 函数...

    文件的读写操作默认使用系统编码,可以通过调用sys.getdefaultencoding() 来得到.在大多数机器上面都是utf-8 编码.如果你已经知道你要读写的文本是其他编码方式,那么可以通过传递 ...

  9. 在qt中用c语言数组,在QT函数中返回一个数组/把一个数组传参给函数

    1.把数组传参给函数 可以定义一个QVector的一个数组 QVector num(10); for(int  i =0;i<10;i++) num [i] = i*i; fun(num); / ...

最新文章

  1. [存储过程]中的事务(rollback)回滚
  2. memcpy实例(一)
  3. 使用bash上传项目到osc@git上
  4. android 打电话
  5. 应用程序中主键ID生成与UUID
  6. 机器视觉软件开发入门(1)
  7. 2021年最棒的10款Java框架,你喜欢哪个?
  8. 打印的几种方法(lodop、window.print)
  9. 像素值、物理尺寸、分辨率三者关系
  10. Springboot定时任务、Quartz表达式
  11. LayerCAM:Exploring Hierarchical Class Activation Maps for Localization
  12. 4款报表工具功能对比,哪款最实用?
  13. 高产攻关保全年粮丰 国稻种芯·中国水稻节:广西多措并举
  14. 大规模知识图谱数据存储实战解析
  15. (新)Chrome浏览器自定义背景插件
  16. 茅台酒如何转卖?价格如何才最合理?爬取公众号后每天自动发送价格到钉钉如何呢?
  17. 菜鸟进阶:在Mac上安装Tomcat+Jenkins
  18. 【python】透小菜参加了华为和阿里的笔试。
  19. 什么是编程?该怎么学习编程?
  20. mfc vs2010 C++ 连接mysql等数据库

热门文章

  1. VB 宏+mysql解决EXCEL表格实现自动化处理
  2. postman测试传入json
  3. ubuntu权限管理
  4. delphi中DateTimePicker控件同时输入日期和时间
  5. Android异常与性能优化相关面试问题-内存管理面试问题详解
  6. BZOJ 2456 : mode
  7. day36 10-Hibernate中的事务:解决丢失更新
  8. 利用angular结合translate为项目实现国际化
  9. (Android Studio)ActionBar's Theme/Style [ActionBar主题风格修改]
  10. 尝鲜党:Nexus5、6刷安卓M教程