传值调用?传引用?指针有啥用?内存四区是啥?

1.前言

        广州某双非二本电子学生,因为大一上学c语言的时候是网课加疫情,所以大摆特摆,这学期学数据结构根本是天书,所以现在决定从0开始重新学习编程,并决定每周写一篇博客记录自己所思所感,权当督促自己,并且记录我是如何从一个小白变成一个不那么白的小白的。若是你能从我的博客获取知识,那就更好不过了。

2.忆宝的疑惑

让我们从一个简单场景开始。

#include<stdio.h>
void Increment(int x)
{
    x=x+1;
}

void main(){
    int a=0;
    Increment(a);
    printf("The value of a is %d",a);
}

        当代大学牲忆宝设计了一个程序,他希望能通过这个程序完成让a加一的艰巨任务。程序分为两部分,主函数和忆宝自定义的一个“加一函数”。可以看出忆宝希望这个程序最终输出值为1.但当忆宝运行后却发现以下结果:

The value of a is 0

        Increment函数就是一个废物!忆宝一气之下把电脑给砸了! (bushi)

        这到底是为什么捏?让我们言归正传,忆宝在写这个程序时犯了一个新手常犯的错误!

        下面我们开始由计算机内存四区说起,让大家大彻大悟!了解了底层原理后相信大家以后再也不会像忆宝一样砸电脑了。

3.内存四区

        计算机的内存又叫随机访问存储器Random Access Memory),简称RAM。 这个RAM呢,又分为四大天王,不是,四大区域,由地址低位到地址高位分别是:代码区、全局区/静态区、堆、栈。大概长这样:

 

        咱们今天探讨的重点是stack)。当程序运行时,计算机会在内存中预留出一块地方给这个程序使用。这便是内存四区。其中我们的男主栈便是所有局部变量的家,接下来我们来把栈单独拉出来模拟运行程序的运行。

         程序都是由主函数开始运行,当程序开始运行时,栈会为主函数安排一个家存放它其中的所有信息,即栈帧stack frame),此时咱们的a已经被存在了栈帧里。然后程序继续运行,遇到了主函数中被调用的Increment函数,此时计算机直接变脸,暂停了主函数的运行!并为新欢Increment函数创建了一个新的栈帧!

         接着,主函数中的a的值被映射到了Increment函数中的x上,所以x得到了0的值,并且也进行了加一的操作,那么忆宝为什么没有得到想要的结果呢?原因是当Increment函数被调用完后,程序会过河拆桥,落井下石,狡兔死,走狗烹。Increment的栈帧会像泡沫一样被程序清除。所以即使局部变量x加了一,但是它只存在于栈帧存在的时候。主函数里的a还是不会有任何变化!!两个栈帧里的局部变量没有任何瓜葛!!注意:函数执行期间局部变量才存在!

就好像我们两个没爱过一样~你像风一样~

  4.传值调用和传引用

现在我们知道了,不是Increment函数没用,是忆宝没用(bushi)。是忆宝只对形参formal argument)x进行了操作,而实参actual argument)a没有任何变化。这种方式叫做传值调用call by value)。若想真正改变a的值该怎么做?忆宝学习了一番后把程序改写成了如下所示:

​
#include<stdio.h>
void Increment(int *p)
{
    *p=*p+1;
}

void main(){
    int a=0;
    Increment(&a);
    printf("The value of a is %d",a);
}

​

再执行后得到结果:

The value of a is 1

OHHHHHHHHHH !!!!!!!忆宝成功了!这是为啥?原来忆宝用取地址符&将a的地址传给了Increment函数中定义的指针。(210瞎编的地址哈,没有任何科学依据滴)

 紧接着Increment函数对该指针进行了解引用操作:

发现了与210地址所存的值是0,找到了真命天子后Increment函数对210地址的值(即a=0) 进行了加一操作,成功让a变成了1!接下来就算Increment消失不见,a的值也已经被改变辣!这种方法便是传引用call by reference)!肿么样?你学会了吗?

5.作者的碎碎念

第一次写这个博客真的写了好久......感觉任务量挺大的,因为我其实也刚刚才学懂,然后我想尽可能用比较有趣易懂的方法讲出来,但又怕我一个小白乱说会误人子弟。还有这些绘图好麻烦...一开始啥都不会,希望慢慢能提高效率和讲解的准确度吧!如果各位大佬发现我讲的有什么错误可以马上指出来,只要我不会我马上就去学。那就酱紫吧。

        

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值