写点什么

【C 语言】return 关键字

作者:謓泽
  • 2022-11-22
    江西
  • 本文字数:3318 字

    阅读完需:约 11 分钟

【C语言】return 关键字

🚩write in front🚩   

🔎大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎

🏅2021 年度博客之星物联网与嵌入式开发 TOP5~2021 博客之星 Top100~阿里云专家博主 & 阿里云星级博主~掘金⇿InfoQ~51CTOP 创作者(创作新人榜 No.8)~[CSDN]周榜 373﹣总榜 1055 ⇿ 全网访问量 40w+🏅

🆔本文由 謓泽 原创 发布在 InfoQ 如需转载还请通知⚠

📝个人主页-InfoQ - 促进软件开发及相关领域知识与创新的传播-极客邦

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝

✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩

②⑩ return ⇿ 返回「栈帧」

⒈描述 ⇨ return 返回值这种形式就能够定义返回值。

⒉作用 ⇨ return 返回值语句的作用是终止一个函数的执行,结束当前代码块中 return 后的语句,即 return 后的语句不再执行,从当前函数退出,为该函数返回一个指定的 expression(表达式)的值。

⒊注意 ⇨ return 在自定义函数使用当中,自定义函数必须是返回类型整形类型(int)才能够进行返回到整形类型当中。

说明⇢在讲解 return 语句之前我们先来看看一组代码。示例代码①如下⇣

#include<stdio.h>
char *fun()
{
	char str[] = "Hello word";
	return str;	
} 
int main(void)
{
	char *s = fun();
	printf("s = %s\n",s);
	return 0;	
} 

运行结果🖊

乱码

🍊在上述代码解析⇢上述的代码当中我们我们不难得知它会产生这样的运行结果,因为我们很清楚这个数组(str)字符串当中它是一份临时数组(地址)。因为它是在 fun()函数当中的代码块当中进行定义的,临时数组就是⇢调用函数的时候形成该数组,返回的时候该数组的空间就会被释放出去了。当然在这里我们如果对其进行用 static 进性修饰的话,此时出了代码块当中空间就不会被释放出去了保留当前的数据。

🍏更深层次的理解如下⇣

概述⇢当我们调用完函数的时候其实此时数组当中的数据是还是存在的。那么如何证明呢很简单我们就来调试下看下此时 s 当中的值是怎么样的。

说明⇢从上述代码当中我们可以看出在调用 printf()打印函数之前对应曾经在 fun()函数的数据是还在的,根本原因就是计算机并不会清空数据,虽然这块数据无效了。但是我们依旧还是可以看到的。

说明⇢ 在上述的图片当中为什么在打印 printf()函数之后 s 的数据会直接乱码呢。

🔥重点→根本原因就是 printf()实际上也是函数,既然 printf()它也是函数,那么 printf()它同时也是要遵守一个规则的调用 printf()的话就会形成栈帧,返回 printf()的话就会释放栈帧。注→新的栈帧结构是会覆盖老的或者说是前面的栈帧结构,对我们来说它进行了二次覆盖的时候那么你曾经的 Hello word 的字符串便不会存在了。经过这个讲述你是不是更加清楚了原来没想到就短短的十行代码却有这么多的知识点(●'◡'●)

🍎注⇢这个数组的意思就是在我们所创建的函数当中或自定义函数当中被称之为临时数组。

示例代码如下②⇣

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
char* fun(char *str)
{
	return str;
}
int main(void)
{
	char str[] = "Hello word";
	printf("s = %s\n", fun(str));
	return 0;
}

运行结果🖊

s  =  Hello word

🕹说明⇢运用指针传递会产生形参实例化的效果,从而它们开辟的空间实际上是一样的。

🎓拓展知识点如下⇣

在 C 语言当中是没有真正意义上的字符串类型的,但是在 C 语言是有字符串的。它不想其它的一些高级语言类型当是拥有字符串类型的,例如-Java、Python、C++ 的这些高级语言当中它们是有字符串类型(str)的。

在 C 语言当中字符串的结束标志是'\0'的,它并不作为字符串内容的一部分。仅仅知识作为字符串当中的结束标志位。但是它依旧是字符,要占空间的。长度不包括'\0',容量包括'\0'。

🍊拓展知识点⇢如何理解栈帧[在调用函数的时候是先一次性给你开辟好栈帧空间然后再调用函数的函数里面内容的叫做为栈]销毁,计算机当中所谓的删除数据究竟是在做什么?

在计算机当中释放空间释放真的要将我们的数据全部清 0/1,所谓的删除数据它绝对不会把数据删除和清 0/1。因为清 0 和清 1 本质上就是目标空间进行写入。假设你今天有 1 个 G 的空间,最后清空全部变成 0 了,那么你也会写入 1 个 G 的数据那么这样删除数据就相当于和把一份 1 个 G 的文件拷贝到你的电脑当中是需要同等的时间的。这个显然是不可能的因为只会把拷贝到你的电脑当中写入进数据是需要一定的时间的,而我们删除数据的时候是很快的不然它们两个就会造成一个同等的时间这个是显然不可能的。

▞简单的来说-拷贝 1 个 G 的时间花了 1min 钟,删除 1 个 G 的时间也需要花上 1min 钟的时间。这个显然是不可能的,因为我们在实际当中明显不会的。我们都非常地清楚拷贝的时间绝对比删除的时间是要花的时间是要多的。

📑计算机在清空数据本质只要设置该数据无效的时候即可。这句话可能比较难以理解那么我们可以来举个例子:比如说我们需要 3G 的 C 语言资料就会有对应的三十个对应的数据块,对我们计算来说我们写入的时候正儿八经的会把 3G 的空间写入进去。但是我们在清空的时候其实只是需要设置成 3 个比特位或者 30 个比特位,那这可以说是相差非常大的了。换言之你有若干个数据块那么要清空一个对应的 0.5G 的空间本质上只需要把若干个比特位给它进行清空就可以了。后续再来数据的时候就可以直接可以再该数据块进行写入,那么这样的话就可以不用再一个是删除的时候只删除很小量的数据。第二个就是不用高频的对磁盘这个存储介质或者其它的任何存储介质进行充电放电或者进行对应的读写同时也可以达到增强硬件的使用寿命。所以一般我们在删除数据的时候并不是把数据进行清空,而是只需要设置该数据的无效即可。具体如何"无效"是需要了解一些文件系统相关的内容的。

🍋文件系统⇢文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于 NAND Flash 的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:文件系统的接口,对对象操纵和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。

📚栈的介绍⇢在执行函数的时候,函数内部局部变量的存储单元都是可以在栈上进行创建的。函数执行结束的时候这些存储单元会被自动的进行释放,栈区主要存放运行函数所分配的局部变量,函数的参数,返回数据,返回地址等。

🌴return — 终止函数的执行

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main(void)
{
    printf("C语言");
    return;
    printf("下面的语句");
}

运行结果🖊

C 语言

🖍说明⇢在上述代码当中我们可以得知返回值后面的语句是不会执行的也证明了 return 后面的语句是不会再被执行的。相当于执行完上面的语句不执行下面的语句退出了。

示例代码如下⇣③

说明⇢创建函数实现两个变量相加并且返回到实参当中去。

#include<stdio.h>
int max()
{
	int a = 10;
    int b = 10;
    return a + b;
}
int main(void)
{
	int ret = max();
	printf("ret = %d\n", ret);
	return 0;
}

运行结果🖊

ret = 20

说明⇢函数的返回值是指函数被调用之后,执行函数体中的代码所得到的结果。 这个结果通过 return 语句返回。

那么可能会有小伙伴会有疑问?这个在 max()函数当中的变量 a、变量 b 难道就不是临时变量吗。那为什么这里调用完之后返回的时候会把结果返回到整形变量 ret 当中去呢。

那么根据上面的我们说过,此时的 a,b 是一个临时变量,最终在 return 返回的时候外部的 ret 是怎么能够拿到 return 返回的临时变量的对应的值​。​​​​​​它难道不会被释放掉吗?那么为什么 ret 会读取到返回的内容的。

其实这个不难理解→当你 max()函数调用完成之后它才能够拥有返回值,调用完之后函数不是应该会被释放掉吗。那么这个 max()当中的临时变脸为什么可以拿回来呢。这个就和我们这里要讲述的 return 语句是有关系的。

对于我们来说这个 a,b 叫做是临时变量,我们返回的时候拿的并不是真的 a,b,而是 a,b 当中对应的内容。

这个 max()形成栈帧会被释放掉了,但是并不会真正的把数据进行清空。


发布于: 刚刚阅读数: 3
用户头像

謓泽

关注

一句话介绍下自己~ 2022-01-29 加入

谁也不知道旅途的终点是怎么样的 现在只不过是刚启航⛳ 便要全力以赴!终点必将是星辰🌠大海🌊 2021年度博客之星物联网与嵌入式开发TOP5 2021博客之星Top100 阿里云专家博主^星级博主 CSDN⇿掘金⇿InfoQ[创作者]

评论

发布
暂无评论
【C语言】return 关键字_11月月更_謓泽_InfoQ写作社区