C语言函数传递与值传递
2016-01-25 11:53
288 查看
C语言提供了两种参数传值机制:一种是值传递,就是将实参的值赋值给形参,换句话说,形参是实参的一份拷贝,因此函数对形参的改变并不影响实参;另一种是参数传递,是一种地址传递,是指将实参的地址赋值给形参,即形参和实参指向同一块内存空间,因此函数对形参对象的处理就是对实参的处理。C语言中实现地址传递的方法一般是将形参指定为指针类型。
为了提高数组的传递效率,C语言中数组作为函数参数传递时实际传递的是数组在内存空间的首地址,不再为函数的形参数组分配内存空间,它共享实参数组的内存空间。函数中对形参数组的处理实际上就是对实参数组的处理,因此能改变实参数组的值。
实例源码:
需要补充说明的是,以一维数组坐函数参数时,一般为不带大小的一维数组,如果需要数组元素个数信息,则另设一个数组类型形参来表示数组的大小;以二维数组作形参时,一般不带数组行数,但列数一定要注明,行数用一个整数类型来表示。
因为地址传递这种参数传递方式可以使函数对形参的操作直接影响到对应的实参,因此我们可以通过这种参数传值方式将被调用函数处理的结果返回到调用函数中。当然,函数名也能带回一个处理结果,但是实际应用中往往需要将被调用函数的多个处理结果返回,此时就需要借助于地址传值了。
为了提高数组的传递效率,C语言中数组作为函数参数传递时实际传递的是数组在内存空间的首地址,不再为函数的形参数组分配内存空间,它共享实参数组的内存空间。函数中对形参数组的处理实际上就是对实参数组的处理,因此能改变实参数组的值。
实例源码:
<span style="font-family:SimHei;font-size:18px;">
#include<stdio.h> void value(int a,int b) { a++; b++; } void addr(int *a,int *b,int c[]) { (*a)++; (*b)++; for(int i=1;i<=10;i++) (*(c+i))++; } int main() { int a,b,i; int c[11]; for(i=1;i<=10;i++) c[i]=i; a=10; b=20; value(a,b); printf("%d %d\n",a,b); addr(&a,&b,c); printf("%d %d\n",a,b); for( i=1;i<=10;i++) printf("%d ",c[i]); printf("\n"); return 0; }</span>
<span style="font-family:SimHei;font-size:18px;">运行结果:</span>
需要补充说明的是,以一维数组坐函数参数时,一般为不带大小的一维数组,如果需要数组元素个数信息,则另设一个数组类型形参来表示数组的大小;以二维数组作形参时,一般不带数组行数,但列数一定要注明,行数用一个整数类型来表示。
因为地址传递这种参数传递方式可以使函数对形参的操作直接影响到对应的实参,因此我们可以通过这种参数传值方式将被调用函数处理的结果返回到调用函数中。当然,函数名也能带回一个处理结果,但是实际应用中往往需要将被调用函数的多个处理结果返回,此时就需要借助于地址传值了。
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言
- C语言实现BMP转换JPG的方法
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- C语言查找数组里数字重复次数的方法