C语言的参数传递
来源:互联网 发布:软件水平考试 几点考 编辑:程序博客网 时间:2024/04/18 10:52
一直没有好好研究C语言参数传递,只是从书上看,知道有传值和传地址两种方式,但调用函数时,他们内部发生什么变化并不清楚,现在写下来。
C语言的参数传递有传值和传地址两种方式。
传值的过程:
(1)行参与实参各占一个独立的存储空间。
(2)行参的存储空间是函数被调用时才分配的。调用开始,系统为行参开辟一个临时
存储区,然后将各实参之值传递给行参,这时行参就得到了实参的值。
(3)函数返回时,临时存储区也被撤销。
传值的特点:单向传递,即函数中对行参变量的操作不会影响到调用函数中的实参变量。
例如:
#include <stdio.h>
void change_by_value(int x){
x=x+10;
}
void change_by_address(int *x){
*x=*x+10;
}
void main(){
int a=3;
printf("a=%d/n",a);
change_by_value(a);
printf("a=%d/n",a);//a的值并没有改变
change_by_address(&a);
printf("a=%d/n",a);//
}
运行结果:
3
3
13
传值方式:
void change_by_value(int x)内部发生的动作应当是当函数被调用时(堆栈调用)
在堆栈上临时分配了一块区域,调用结束,出栈。
void change_by_value(int x){
int _x=x;//拷贝一份传递给临时变量_x
_x=_x+10;//改变的是_x,不是x
}
地址传递方式:参数是地址
void change_by_address(int *x){
*x=*x+10;
}
实参和行参共享一个存储单元,对行参的操作相应的就改变了实参,此时参数传递是双向的。
此外,参数的存储位置和变量的存储属性对参数传递也有影响,变量的存储属性有动态变量、静态变量
外部变量,动态变量有2种,自动(auto)和寄存器(register)变量。
此外还应注意内存的分配方式,内存分配方式有三种:
(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的
整个运行期间都存在。例如全局变量,static 变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函
数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集
中,效率很高,但是分配的内存容量有限。
(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意
多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存
期由我们决定,使用非常灵活,但问题也最多。
C语言的参数传递有传值和传地址两种方式。
传值的过程:
(1)行参与实参各占一个独立的存储空间。
(2)行参的存储空间是函数被调用时才分配的。调用开始,系统为行参开辟一个临时
存储区,然后将各实参之值传递给行参,这时行参就得到了实参的值。
(3)函数返回时,临时存储区也被撤销。
传值的特点:单向传递,即函数中对行参变量的操作不会影响到调用函数中的实参变量。
例如:
#include <stdio.h>
void change_by_value(int x){
x=x+10;
}
void change_by_address(int *x){
*x=*x+10;
}
void main(){
int a=3;
printf("a=%d/n",a);
change_by_value(a);
printf("a=%d/n",a);//a的值并没有改变
change_by_address(&a);
printf("a=%d/n",a);//
}
运行结果:
3
3
13
传值方式:
void change_by_value(int x)内部发生的动作应当是当函数被调用时(堆栈调用)
在堆栈上临时分配了一块区域,调用结束,出栈。
void change_by_value(int x){
int _x=x;//拷贝一份传递给临时变量_x
_x=_x+10;//改变的是_x,不是x
}
地址传递方式:参数是地址
void change_by_address(int *x){
*x=*x+10;
}
实参和行参共享一个存储单元,对行参的操作相应的就改变了实参,此时参数传递是双向的。
此外,参数的存储位置和变量的存储属性对参数传递也有影响,变量的存储属性有动态变量、静态变量
外部变量,动态变量有2种,自动(auto)和寄存器(register)变量。
存储属性
register
auto
static
extern
存储位置
寄存器
主存
生存期
动态生存期
永久生存期
作用域
局部
局部或全局
全局
此外还应注意内存的分配方式,内存分配方式有三种:
(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的
整个运行期间都存在。例如全局变量,static 变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函
数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集
中,效率很高,但是分配的内存容量有限。
(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意
多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存
期由我们决定,使用非常灵活,但问题也最多。
- C语言的参数传递
- C语言的参数传递
- C语言的参数传递
- c语言的参数传递
- C语言--参数的传递
- c语言参数传递
- C语言参数传递
- C语言参数传递
- C语言参数传递
- C语言参数传递
- C语言参数传递
- C语言 参数传递
- C语言参数传递
- c语言传递参数
- C语言的参数传递方式
- C语言函数参数的传递
- 关于C语言参数传递的新知
- C语言函数参数的传递详解
- word 弹出语音识别、数据丢失、空间不够对话框问题解决
- 工业计算机在网络安全上的应用
- Linux下Oracle字符集问题引发的汉字插入失败解决方案
- Oracle 8i中字符集乱码问题析及其解决办法
- CVS小问题解决方法
- C语言的参数传递
- 解密验证码技术
- 走近 STL(适合初学者)
- 如何防止Access数据库被下载- -
- 简单问题:用javascript 如何得到明天的这个时候.
- [转载]3721驻留机制简单研究- -
- Open source portals(选择)
- EAI项目所面临的企业环境及EAI做什么
- 网络邻居问题