一直没有搞懂的C语言参数传递,今天终于明白了

简介: 一直没有搞懂的C语言参数传递,今天终于明白了

本讲我们和大家一起来聊一聊C语言中有关参数传递的一些知识。

 

1. 问题引入

请写出以下程序的打印结果。

#include <stdio.h>

 

// 将某整数加10

void add_by_10(int  a){

           a = a + 10;

}

 

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

           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中定义的程序,我们有两个函数mainadd_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语言中有关参数传递的一些知识点旨在帮助初学者更好的理解参数传递中一些容易犯错的地方。

 

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

目录
相关文章
|
6月前
|
存储 C语言
向函数传递结构体: C语言中的结构体参数传递详解
向函数传递结构体: C语言中的结构体参数传递详解
497 0
|
6月前
|
存储 C语言
C 语言函数完全指南:创建、调用、参数传递、返回值解析
函数是一段代码块,只有在被调用时才会运行。 您可以将数据(称为参数)传递给函数。 函数用于执行某些操作,它们对于重用代码很重要:定义一次代码,并多次使用。
188 3
|
6月前
|
存储 算法 C语言
C语言指针与二维数组在函数参数传递和动态内存管理中的应用
C语言指针与二维数组在函数参数传递和动态内存管理中的应用
60 0
|
机器学习/深度学习 存储 C语言
|
C语言
《C语言及程序设计》程序阅读——参数传递方式:传值与传地址
返回:贺老师课程教学链接 请分析下面程序的输出结果,对照在计算机上的运行结果,解释得到输出的过程。 建议:通过在纸上画出内存变化的过程,洞悉计算机执行的过程。(1) #include&lt;stdio.h&gt; void fun(int x,int y,int *z) { *z=x*x+y*y; } int main() { int a=31; fun(5,2,
1259 0
|
C语言
C语言及程序设计提高例程-6 参数传递方式:传值与传地址
贺老师教学链接  C语言及程序设计提高 本课讲解 我要交换! #include &lt;stdio.h&gt; void myswap(int x, int y) { int t; t=x; x=y; y=t; } int main() { int a,b; scanf("%d %d", &amp;a, &amp;b); printf
918 0
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
33 3
|
6天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
21 6
|
26天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
34 10