一、对一些概念的粗糙理解
①栈
主要作用:
- 保存函数的局部变量; 向被调用函数传递参数;
- 返回函数的返回值;
- 保存函数的返回地址.
- 返回地址是指从被调用函数返回后调用者应该继续执行的指令地址
个人理解:当我要传参数进我一个函数的子函数中,对所传的参数实际上要进行一个赋值的操作(即父函数的实参给到子函数的形参),然后这些数值实际上存到了这个子函数在内存中所开辟的栈中。然后当子函数的调用结束后,返还得到的值和地址,然后该子函数的栈就会被释放。这其中还涉及到计算机组成原理的知识,如果想深挖,可以看看这篇文章:函数调用栈分析。
②变量的生命周期
老师在讲这个概念的时候,说了两个对象:全局变量和局部变量。局部变量的生命周期就是在一个函数里面(例如下面的fi(int a)),当这段程序执行完毕的时候,局部变量a的生命周期就结束了;而全局变量则是当整个程序执行完时,它的生命周期才结束。
③变量的作用域
个人理解:就是在一定的区域可以使用这个变量的区域。全局变量的话整个程序都可以使用,而局部的则只能在该段函数中使用。说个例子就是你们班有个人叫张三,隔壁班也有个人的名字叫张三。有一天你们班张三的朋友李四来学校找他,但是他跑到隔壁班大喊了一声:张三,爸爸来了!这时候隔壁班的同学都以为李四是他们班张三的朋友,而不是你们班张三的朋友。
二、例子讲解
①输出两个不同作用域下局部变量a的值
先看一段代码
在看下面的分析前,希望你能自己猜一下上面函数的输出值及其顺序
12
10
其实一开始我以为这里会输出这两个值:11、11
。因为我认为这段void的函数将a进行加一的操作,同时更新main函数中的a。但是看到结果:并没有。后面查阅了资料,得到如下结论:
- 首先fi(int a)中的a是作为一个独立变量的,它跟main中的a并没有什么关联,故在进行a++操作时,只是将fi函数中的局部变量a进行加一,对main中的a并没有什么影响。
- 不报错的原因:main中的变量a的生命周期是当main函数执行到return 0;之后结束;fi中的变量a的生命周期则是当fi函数执行完结束。二者并不在同一个栈里面。如果你在同一个函数中声明两个同名的变量,编译器会报错提示你变量同名了。