聊一聊C语言的参数传递

本讲咱们和你们一块儿来聊一聊C语言中有关参数传递的一些知识。函数

1. 问题引入操作系统

请写出如下程序的打印结果。内存

#include <stdio.h>io

// 将某整数加10编译

void add_by_10(int  a){基础

            a = a + 10;变量

}原理

int main(int argc, char *argv[]){gc

            int a = 2;程序

            add_by_10(a);

            printf("a= %d\n", a);

}

上面的程序很是的简单,咱们定义了一个函数add_by_10,它的功能是实现整数加10,而后在main函数中调用,因为a初始值为2,当调用函数了之后,a的值变成了12。

事实真是如此吗?若是你编译执行了这段程序,你会发现打印的结果是:"a  =  2".

为何会这样呢?这和你想的彻底不同。

2. 问题分析

接下来咱们就和你们一块儿来分析为何会是这样的结果。

以前的文章咱们讲过,所谓变量的定义其实就是从4G的内存条上去拿空间,如你定义了一个int  a;其本质含义就是要从你新买的4G内存条上拿走一块4字节大小的空间,以下所示,黄色部分的空间就是属于a的,其余人不能用哈。

咱们再将该问题深刻一些,其实系统在分配内存时,是以函数为基本单元,如问题1中定义的程序,咱们有两个函数main和add_by_10,因此系统会先分别给这两个函数分配内存,而后这两个函数内部的变量都会在各自函数所属的内存空间去拿内存。

在4G的内存条上有一部分区域是属于main函数的(黄色区域),还有一部分区域是属于add_by_10函数的(橙色区域),以下所示:

main函数中定义了一个int  a;因此这个a会从main区域拿走4字节的空间(黑色区域),并赋值为2。另外add_by_10函数中有一个参数int  a因此这个a也会从add_by_10区域拿走4字节空间(灰色区域),以下所示:

当在main函数中执行add_by_10(a)这行代码时,会将main函数a的值,赋给add_by_10函数的形参a,以下:

add_by_10函数中,对其所属的a变量执行了加10操做后,a变成了12,以下:

 

add_by_10函数调用结束后,将会释放add_by_10的内存空间。

从上面的一步一步分析,你们能够看到,其实main函数中的a一直都是2,并无发生任何的改变,而改变的只是add_by_10函数中的a值。因此这就是为何你最终看到的结果是:"a= 2"而不是"a= 12"。

请思考:怎样才能达到"a = 12"这个结果?

3. 总结

本文给你们介绍了C语言中有关参数传递的一些知识点旨在帮助初学者更好的理解参数传递中一些容易犯错的地方。

另外本文部份内容描述不是特别严谨,旨在用最简单的方式帮助初学者更好的理解参数传递,待有必定的基础后,可深刻了解函数栈的基本原理及操做系统是如何管理内存的。

相关文章
相关标签/搜索