能否向函数传递一个数组?
能否向函数传递一个数组?
例:
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 个元素的数组。
能否向函数传递一个数组?相关推荐
- 向函数传递一维数组和已知大小的二维数组
一维数组 在C语言中,向函数传递参数只有一种形式--值传递.不管是传递一个整型变量,还是传递一个指针,函数得到的都只是实参的拷贝值. 先定义一个一维整型数组: int a[] = { 0, 1, 2, ...
- c++函数返回一个数组
https://www.cnblogs.com/walter-xh/p/6192800.html ---恢复内容开始--- 调用某个函数时经常需要函数返回一个值,我们都知道c++ 的函数返回的是一个c ...
- c语言函数将如何返数组,声明一个C函数返回一个数组
有几点要指出. 首先,您不能像在这里那样分配数组对象: char A[WIDTH][HEIGHT]; A=rand_grid(WIDTH,HEIGHT); 数组类型的对象不可修改. 其次,C语言中的函 ...
- php创建数组教程,PHP中使用array函数新建一个数组
PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合 ...
- C语言,向函数传递一维数组,计算最高分,平均分,人数(要求输入负值时输入结束,且不能超过40人)
声明:该编译器为vs,所以输入函数写为scanf_s形式! 代码如下: #include <stdio.h> #define N 40 int ReadScore(int score[]) ...
- C语言,向函数传递一维数组,调用函数并计算平均成绩
代码如下: 说明:编译器为vs,所以使用的是scanf_s #include <stdio.h> #define N 40 int Average(int score[], int n); ...
- php 闭包传参_php如何给函数传递一个闭包函数参数?
class Di { private $factory; public function set($id, $value) { $this->factory[$id] = $value; } p ...
- python open函数encoding_python 读不同编码的文本,传递一个可选的encoding 参数给open() 函数...
文件的读写操作默认使用系统编码,可以通过调用sys.getdefaultencoding() 来得到.在大多数机器上面都是utf-8 编码.如果你已经知道你要读写的文本是其他编码方式,那么可以通过传递 ...
- 在qt中用c语言数组,在QT函数中返回一个数组/把一个数组传参给函数
1.把数组传参给函数 可以定义一个QVector的一个数组 QVector num(10); for(int i =0;i<10;i++) num [i] = i*i; fun(num); / ...
最新文章
- [存储过程]中的事务(rollback)回滚
- memcpy实例(一)
- 使用bash上传项目到osc@git上
- android 打电话
- 应用程序中主键ID生成与UUID
- 机器视觉软件开发入门(1)
- 2021年最棒的10款Java框架,你喜欢哪个?
- 打印的几种方法(lodop、window.print)
- 像素值、物理尺寸、分辨率三者关系
- Springboot定时任务、Quartz表达式
- LayerCAM:Exploring Hierarchical Class Activation Maps for Localization
- 4款报表工具功能对比,哪款最实用?
- 高产攻关保全年粮丰 国稻种芯·中国水稻节:广西多措并举
- 大规模知识图谱数据存储实战解析
- (新)Chrome浏览器自定义背景插件
- 茅台酒如何转卖?价格如何才最合理?爬取公众号后每天自动发送价格到钉钉如何呢?
- 菜鸟进阶:在Mac上安装Tomcat+Jenkins
- 【python】透小菜参加了华为和阿里的笔试。
- 什么是编程?该怎么学习编程?
- mfc vs2010 C++ 连接mysql等数据库