初见程序问题

一、对一些概念的粗糙理解

①栈

主要作用:

  1. 保存函数的局部变量; 向被调用函数传递参数;
  2. 返回函数的返回值;
  3. 保存函数的返回地址.
  4. 返回地址是指从被调用函数返回后调用者应该继续执行的指令地址

       个人理解:当我要传参数进我一个函数的子函数中,对所传的参数实际上要进行一个赋值的操作(即父函数的实参给到子函数的形参),然后这些数值实际上存到了这个子函数在内存中所开辟的栈中。然后当子函数的调用结束后,返还得到的值和地址,然后该子函数的栈就会被释放。这其中还涉及到计算机组成原理的知识,如果想深挖,可以看看这篇文章:函数调用栈分析

②变量的生命周期

       老师在讲这个概念的时候,说了两个对象:全局变量和局部变量。局部变量的生命周期就是在一个函数里面(例如下面的fi(int a)),当这段程序执行完毕的时候,局部变量a的生命周期就结束了;而全局变量则是当整个程序执行完时,它的生命周期才结束。

③变量的作用域

       个人理解:就是在一定的区域可以使用这个变量的区域。全局变量的话整个程序都可以使用,而局部的则只能在该段函数中使用。说个例子就是你们班有个人叫张三,隔壁班也有个人的名字叫张三。有一天你们班张三的朋友李四来学校找他,但是他跑到隔壁班大喊了一声:张三,爸爸来了!这时候隔壁班的同学都以为李四是他们班张三的朋友,而不是你们班张三的朋友。

二、例子讲解

①输出两个不同作用域下局部变量a的值

先看一段代码
在这里插入图片描述
在看下面的分析前,希望你能自己猜一下上面函数的输出值及其顺序

12
10

       其实一开始我以为这里会输出这两个值:11、11。因为我认为这段void的函数将a进行加一的操作,同时更新main函数中的a。但是看到结果:并没有。后面查阅了资料,得到如下结论:

  1. 首先fi(int a)中的a是作为一个独立变量的,它跟main中的a并没有什么关联,故在进行a++操作时,只是将fi函数中的局部变量a进行加一,对main中的a并没有什么影响。
  2. 不报错的原因:main中的变量a的生命周期是当main函数执行到return 0;之后结束;fi中的变量a的生命周期则是当fi函数执行完结束。二者并不在同一个栈里面。如果你在同一个函数中声明两个同名的变量,编译器会报错提示你变量同名了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值