温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
  • 忘记密码?
登录注册×
获取短信验证码
其他方式登录
点击 登录注册 即表示同意 《亿速云用户服务条款》
  • 服务器
  • 数据库
  • 开发技术
  • 网络安全
  • 互联网科技
登 录 注册有礼
最新更新 网站标签 地图导航
产品
  • 首页 > 
  • 教程 > 
  • 开发技术 > 
  • C语言中的变量作用域、链接和存储期的意义是什么

C语言中的变量作用域、链接和存储期的意义是什么

发布时间:2021-05-31 13:49:02 来源:亿速云 阅读:144 作者:小新 栏目: 开发技术

小编给大家分享一下C语言中的变量作用域、链接和存储期的意义是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

在c中变量有三种性质:
1、存储期限:变量的存储期限决定了变量占用的内存空间什么时候会被释放,具有动态存储期限的变量会在所属的程序块被执行时获得内存空间,在结束时释放内存空间。具有静态存储期限的变量在程序运行的整个期间都会占用内存空间。
2、作用域:变量有块作用域也有文件作用域,结合序章第一张图可以明白块作用域是在某些程序块内起作用,文件作用域是在整个c文件之内起作用。
3、链接:链接是各个文件之间的关系,具有内部链接的变量只在本文件内起作用,具有外部链接的变量可以在不同文件内起作用。具有无链接的变量只在某一个文件的某个函数内起作用。

C语言中的变量作用域、链接和存储期的意义是什么

C变量作用域、链接和存储期的含义

错误的定义C语言变量的作用域、链接和存储区在某种程度上会直接影响程序的设计,我们通过这篇博文介绍如何正确合理的定义一个C变量。

从定义一个C变量开始成为一个C高手

一、基本术语   

1.1 什么是对象(object)

       C语言中的对象含义与C++的完全不同,C语言中的对象指的是存储数据的一块内存。对象可以存储一个或多个值,一个对象可能并未存储实际的值,但是在存储适当的值时一定具有相应的大小。对象可以存在于程序的执行期,也可以仅存在于它所在函数的执行期。

  1.2 什么是标识符(identifier)

       标识符就是一个名称,通过这个标识符可以修改对象的内容。标识符可以在源代码的多文件中共享、可用于特定文件的任意函数中、可仅限于特定函数中使用,甚至只在函数中的某部分使用。

举个例子,我们定义一个int型变量point:

int point;

对象与标识符的关系如下图

C语言中的变量作用域、链接和存储期的意义是什么

二、作用域、链接和存储期三者关系

       存储期用来描述对象,所谓的存储期就是指对象在内存中可以保留多长时间。

       标识符用于访问对象,使用作用域(scope)和链接(linkage)描述标识符,标识符的作用域和链接表明了程序的哪些部分可以使用它。

三、作用域详解

作用域描述程序中可访问标识符的区域
一个C变量的作用域可以是块作用域、函数作用域、函数原型作用域和文件作用域,下面我们详细讲解每个作用域的含义。

  3.1 块作用域

       块是用一对花括号括起来的代码区域,定义在块中的变量具有块作用域块作用域变量的可见范围是从定义处到包含该定义的块的末尾

       另外,虽然函数的形式参数声明在函数的左花括号之前,但它们也具有块作用域,属于函数体这个块。

int Star_CongShanRuoShui(int user_id)
{
	int res = 0;
	......
	return 
}

?上面code中“user_id”和“res”都具有块作用域

int Star_CongShanRuoShui(int user_id[] , int n)
{
	int res = 0;
	for(int i=0;i<n;++i)
	{
		......
		int q=0;   //q的作用域开始
		
		......
	}              //q的作用域结束
	......
	return 
}

?上面code中变量“q”的作用域仅限于for循环的循环体中

    3.1.1 块概念的扩展

       C99将块概念扩展到包括for循环、while循环、do while循环和if语句所控制的代码,即使这些代码没有使用花括号括起来,也算是块的一部分,下面的code?

#include<stdio.h>

int main()
{
	int Star_CSRS = 8;
	printf("[main] value of Star_CSRS is %d | address of Star_CSRS:%p\n",
			Star_CSRS ,&Star_CSRS);
	
	for(int Star_CSRS=0;Star_CSRS<4;++Star_CSRS)
	{
		printf("[for index] value of Star_CSRS is %d | address of Star_CSRS:%p\n",
			Star_CSRS ,&Star_CSRS);
			
		int Star_CSRS = 6;
		printf("[for] value of Star_CSRS is %d | address of Star_CSRS:%p\n",
			Star_CSRS ,&Star_CSRS);
		
		++Star_CSRS;
	}
	
	printf("[main] value of Star_CSRS is %d | address of Star_CSRS:%p\n",
			Star_CSRS ,&Star_CSRS);

	return 0;
}

输出如下:

C语言中的变量作用域、链接和存储期的意义是什么

  • 在main中定义了变量Star_CSRS,在for循环头中定义的变量Star_CSRS 隐藏了main中的Star_CSRS

  • for的循环体中的Star_CSRS又隐藏了for循环头中的Star_CSRS

C语言中的变量作用域、链接和存储期的意义是什么  

 3.2 函数作用域

       函数作用域的概念仅限于goto语句的标签。这意味着即使一个标签首次出现在函数的内层块中,它的作用域也延伸至整个函数中(详细可以参考我的这篇博文)。

3.3 函数原型作用域

       用于函数原型的形参变量名,如下所示:

int Star_CongShanRuoShui(int user_id);

       函数原型作用域的范围是从形参定义处到原型声明结束。对于函数原型中的形参编译器只关心形参类型,不关系具体的形参名即使有形参名也不必与函数定义中的形参名相匹配

       只有在变长数组中,形参名才有意义,如下例(变长数组详细参考我的这篇博文):

int Star_CongShanRuoShui(int n ,int user_id[n]);

  3.4 文件作用域

       定义在所有函数外的变量具有文件作用域。具有文件作用域的变量,从它的定义处到该定义所在文件的末尾均可见(文件作用域变量也称为全局变量)。

翻译单元与文件

编译器将一个源代码文件和所有的头文件都看成一个包含信息的单独文件,这个文件被称为翻译单元一个翻译单元包括一个源代码文件和它所include的文件如果一个程序有多个源代码文件,那么这个程序也将有多个翻译单元一个文件作用域变量的可见范围其实是整个翻译单元(一个源代码文件+头文件)

四、链接详解

C变量有3中链接属性:无链接、内部链接、外部链接

  4.1 无链接

       具有块作用域、函数作用域和函数原型作用域的变量都是无链接变量。这意味着这些变量属于定义它们的块、函数或原型私有。

  4.2 内部链接

       内部链接变量只能在一个翻译单元中使用,该变量使用存储类别说明符static修饰,如下:

int Star_CSDN=1;                     //文件作用域,外部链接
static int Star_CongShanRuoShui=2;   //文件作用域,内部链接

int main()
{
	......
	return 0
}

  4.3 外部链接

       外部链接变量可以在多个文件中使用。外部链接变量的声明分为“定义性声明”和“引用性声明”。C编译器要求一个变量只能定义一次,重复定义编译器会报错。如果需要在其它文件中使用外部链接变量需要使用extern引用性声明这个变量,如下面cdoe:

//file a.c

//在文件a.c中定义一个外部链接变量Star_CongShanRuoShui
int Star_CongShanRuoShui = 2;

......
//file b.c

//文件b.c中使用extern引用性声明变量Star_CongShanRuoShui
extern int Star_CongShanRuoShui;

......

五、存储期详解

C对象有4种存储期:静态存储期、线程存储期、自动存储期、动态分配存储期。

  5.1 静态存储期

       具有静态存储期的对象,它在程序的执行期间一直存在。文件作用域变量具有静态存储期

注意,对于文件作用域变量,关键字static表明了其链接属性,而非存储期。以static声明的文件作用域变量具有内部链接属性,但是无论是内部链接还是外部链接,所有文件作用域变量都具有静态存储期。

  5.2 线程存储期

       线程存储期用于并发程序设计,程序执行可被分为多个线程。具有线程存储期的对象,从被声明时到线程结束一直存在。以关键字__Thread_local声明一个对象时,每个线程都获得这个变量的私有备份

  5.3 自动存储期

       块作用域的变量通常都具有自动存储期。当程序进入定义这些变量的块时,为这些变量分配内存;当退出这个块时,释放刚才为这些变量分配的内存。通过这种做法可以实现内存的重复利用。

变长数组稍有例外,它的存储期从声明处到块的末尾,而不是从块的开始处到块的末尾

       我们上面说块作用域的变量通常都具有自动存储期,但是也能具有静态存储期。为了创建这样的变量,要把变量声明在块中,且在声明前加上关键字static,如下例:

int Star_CongShanRuoShui(int user_id)
{
	static int isStar = 0;
	......
	return 
}

       变量isStar存储在静态内存中,它从程序被载入到程序结束期间都存在。但是,它的作用域定义在Star_CongShanRuoShui()函数块中,只有在执行该函数时,程序才能使用isStar访问它所指定的对象(当然,也可以存储该变量的地址实现间接访问该对象)

 5.4 动态分配存储期

       程序运行时通过malloc()等内存分配函数分配的对象具有动态分配存储期,这样的对象需要使用free()函数进行销毁。

动态内存分配和变长数组在功能上有些重合,但是还是有所不同:

变长数组是自动存储类型用malloc函数创建的数组不必局限在一个函数中使用

以上是“C语言中的变量作用域、链接和存储期的意义是什么”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节
推荐阅读:
  1. startupProbe存在的意义是什么?
  2. 和QT零距离接触的意义是什么

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c语言
  • 上一篇新闻:
    微信小程序组件textarea多行输入框的示例分析
  • 下一篇新闻:
    MongoDB搭建集群的方法

猜你喜欢

  • vba中变量的命名规则有哪些
  • python变量赋值规范是什么
  • python同步赋值语句怎么写
  • python中异常处理的作用有哪些
  • mongodb写入策略有哪些
  • mongodb用户标签怎么存储
  • python抛出异常继续执行的方法是什么
  • centos如何挂载本地镜像文件
  • linux怎么挂载根文件系统
  • linux取消挂载镜像的方法是什么
最新资讯
  • LAMP环境MySQL索引优化方法
  • LAMP服务器资源监控与管理技巧
  • LAMP环境PHP版本升级注意事项
  • Apache在LAMP中的角色与性能考量
  • LAMP架构适合哪些类型网站
  • Linux中LAMP配置最佳实践分享
  • LAMP与LEMP,Linux服务器如何选择
  • LAMP环境如何保障网站安全
  • Linux下LAMP环境搭建难点解析
  • LAMP架构如何优化Linux服务器性能
相关推荐
  • 数据库中QPS和TPS的意义是什么
  • 云存储有什么意义
  • Java中void的用法和意义是什么
  • golang中闭包的意义是什么
  • HashMap存在的意义是什么
  • Java 中接口存在的意义是什么
  • C语言中的作用域、链接、存储期的概念
  • OAM存在的意义是什么
  • 网络爬虫的意义和原理是什么
  • Java中接口存在的意义是什么

相关标签

c语言的一些基础程序 c语言学习 c语言原创文章 c语言学习总结 c语言结构体 c语言中 c语言初学者 c语言操作 c语言指针 c语言基础 c语言库函数 c语言编程 c语言项目 c语言c程序c/c++ C语言标识符 ai android access == auto
AI

深圳SEO优化公司网站排名优化步骤重庆涪陵网站优化有哪些安徽网站优化推广公司直销网站优化全网推广网站优化天津企业网站排名优化方案网站优化推广营销公司大安网站优化江苏咨询网站搭建优化曹县个性化网站优化推广哪家好seo网站优化方案怎么写常州网站建设优化太原网站排行优化长安小网站优化价格深圳外贸网站关键词优化推广保定市网站seo优化排名天津优化网站有哪些网站推广与优化关键词余杭区网站排名优化服务广东企业网站优化哪家好湖北建网站优化广东 网站优化沁阳百度网站优化方案教育培训网站优化获客韶关企业网站关键词优化工具阿拉善盟网站seo优化株洲网站关键字优化宝山区企业网站优化方案定制浦东新区百度网站优化揭阳首页网站关键词优化方法歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化