C——函数(2)

函数前半截知识点详见(http://t.csdnimg.cn/TCMCc

目录

1.static 和 extern

1.1 作用域

1.2 生命周期

1.3 static修饰局部变量

1.4 static修饰全局变量

1.5 static修饰函数


1.static 和 extern

static 和 extern 都是C语言中的关键字。

static是“静态的”的意思,作用为;

    修饰全局变量;

    修饰局部变量;

    修饰函数。

extern 是用于声明外符号的。

在了解 static 和 extern 之前先回顾一下:作用域生命周期

1.1 作用域

作用域(scope)是程序的设计概念,通常来说,一段程序代码中所用的名字并不是总是有效、可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。

(1)局部变量的作用域是变量所在的局部范围。

(2)全局变量的作用域就是整个项目。

程序中的 c 是全局变量,就类似于路上的共享单车,任何人都可以使用,而下面的 a 和 b 都是局部变量,是你自己的单车,有使用范围。a 的报错原因使因为 a 的作用域是从10行的 { 到18行的 } 。19行显然超出了 a 的作用域。

1.2 生命周期

生命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的一个时间段。

(1)局部变量的生命周期:进入作用域变量创建,生命周期开始,出作用域生命周期结束。

(2)全局变量的生命周期:整个程序的生命周期。

1.3 static修饰局部变量

先看程序有 static 和没有 static 的结果:

代码1的输出结果为11111;代码2是12345;两者就差在第7行的static上,为什么呢?

代码1:每次进入test中先创建变量(生命周期开始)并且赋值为0,然后++,再打印,所以5次打印的结果都为1,出函数后变量生命周期结束(释放内存)。

代码2:从输出结果可以知道,a是累加的,test创建变量后,在出函数的时候a的值没有被销毁,这样下一轮进入函数的时候就不会重新创建变量,直接用上一轮的a值计算。

调试代码,调出反汇编窗口,发现“static int a = 0”下面没有对应的汇编代码,所以代码不会重新创建变量,而“int a = 0”下面就有相应的汇编代码。

 由此得到结论:static 修饰局部变量改变了变量的生命周期,生命周期的改变的本质是改变了变量的存储类型,本来一个局部变量是存储在内存的栈区的,但是被static修饰后就存储到了静态区,存储在静态区的变量和全局变量是一样的,生命周期就和程序的生命周期一样长,只有程序结束,变量才会被销毁,内存才会回收,但作用域不变。

所以,如果想要一个变量出函数后任然保留值用于下次,就可以使用static。

1.4 static修饰全局变量

给出代码1和代码2:

当中的 extern 是用来声明外部符号,如果一个全局的符号在A文件中定义的,在B文件中使用,就可以使用 extern 进行声明。

运行之后会发现,代码1正常运行,代码2会报错;

static 修饰全局变量:

1.全局变量是具有外部链接属性的;

2.全局变量被 static 修饰后,外部链接属性就变成了内部链接属性,也就是说,这个全局变量只能在自己所在的 .c 文件中使用,其他文件看不到。所以它的作用域变小了。

所以,如果一个全局变量你只想在它所在的源文件使用,不想被其他文件发现,就可以使用 static

1.5 static修饰函数

给出代码1和代码2:

运行之后会发现,代码1正常运行,代码2会报错;

static 修饰函数:

1.函数是具有外部链接属性的;

2.函数被 static 修饰后,外部链接属性就变成了内部链接属性,也就是说,这个全局变量只能在自己所在的 .c 文件中使用,其他文件即使声明了也用不了。

所以,如果一个函数你只想在它所在的源文件使用,不想被其他文件发现,就可以使用 static。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
sscanf函数C语言中一个非常常用的函数,它可以将一个字符串按照指定的格式转换成相应的数据类型。在嵌入式开发中,sscanf函数也是非常常见的,因为很多时候需要从串口或者其他外部设备中读取数据,并将其转换成相应的数据类型进行处理。下面是一些sscanf函数的使用技巧: 1. 使用sscanf函数时一定要注意格式字符串的正确性。格式字符串中的占位符必须与待转换的数据类型相对应,否则会发生未知错误。 2. 如果待转换的字符串中包含多个数据,可以使用多个占位符进行转换。例如,如果待转换的字符串为"1,2,3",可以使用" %d,%d,%d"的格式字符串进行转换。 3. 可以使用sscanf函数的返回值来判断转换是否成功。如果返回值等于待转换字符串的长度,则说明转换成功,否则转换失败。 4. 如果待转换的字符串中包含浮点数,可以使用"%f"或者"%lf"的格式字符串进行转换。 5. 如果待转换的字符串中包含十六进制数,可以使用"%x"的格式字符串进行转换。 6. 如果待转换的字符串中包含字符或字符串,可以使用"%c"或者"%s"的格式字符串进行转换。 7. 如果待转换的字符串中包含指针类型的数据,可以使用"%p"的格式字符串进行转换。 总之,在使用sscanf函数时一定要注意格式字符串的正确性,否则很容易出现转换错误的情况。同时,还应该注意sscanf函数返回值的判断,以确保转换的正确性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YMLT花岗岩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值