第8章 函数(五)变量的分级保护
来源:互联网 发布:淘宝开店教程百度云 编辑:程序博客网 时间:2024/06/06 01:51
声明:文中观点仅代表个人,其中文字、图片未经本人许可,不得部分或全部转载,违者所造成影响后后果自负!联系本人方式:80368704@qq.com QQ:80368704
上一节我们在全局变量和局部变量难以取舍的矛盾中结束,其实在现实世界中,存在着许多矛盾,他们是如此的对立,但是又同时存在,缺一不可.
比如:生和死,甜和苦,真和假,男和女,笑和苦,实在是太多了,他们是对立着,同时又统一着,不是吗?人分男和女;人人生娃,都想要男的,没有女娃可以吗?哈哈,矛盾啊矛盾!!!
我要说的就是局部变量和全局变量各有优点,我们都需要;不一定要否定掉其中的一个,只不过到底用哪一种,需要我们程序员自己选择罢了.也就是变量该如何被共享和保护应该由程序员自己决定,而且必须能由程序员决定;对于一个变量,程序员必须有足够的权利去决定,它让哪些程序或函数使用,同时又不让哪些程序或函数使用.
于是在C程序设计中,采用了变量分级保护的思想。什么是分级保护的思想呢?举个例子吧:
对于我个人,有些事情,除了自己,不想让任何人知道的,这样的信息就是我的绝密!而有些事情,除了家人,就不想让外人知道了,这样的信息对我来说就是机密!另外的一些事情,是可以让任何人知道的,这样的信息就是公告了!我们常说:该你知道的,告诉你;不该你知道的,别打听,否则会大祸临头的.个人的信息就这样被我简单的分成了3个保密级别:绝密、机密和公告。这就是我所谓的信息分级保护的思想。更确切的说是分区域或分范围的保护,这里的范围有3个:个人、家庭、全社会。我的信息受到了分级思想的保护,从而不会被不该知道的人知道。
回到C程序设计中来,我们的变量作为程序中的信息,也应能被分级保护;而在第2节中,我们说到程序分4级:工程---文件---函数---复合语句块,因此变量根据定义位置的不同,分4级进行保护,使其不被不该使用它的程序见到它,或者说存取它。
详细的,在C程序设计中,我们为变量设定的4级保护是:
块级的变量:相当于最严密的绝密级保护,变量定义在某个块的"{"处,就是块级变量。它只能被定义它的复合语句块中的语句读写;在块内部定义变量时,你可以在变量的定义语句前面加上如下3个词之一:(1)、auto (2)、register (3)、static。 auto说白了就是普通变量,以前我们定义的变量全部是auto变量,写不写auto无所谓。register是寄存器局部变量,初学者不必理解和使用它.而在变量的定义语句加上static后,该变量就定义成了静态的块局部变量.
举例如下:
#include<stdio.h>
void main()
{
auto int i=1;/*函数局部变量*/
do
{ auto int j=1;/*块局部变量,auto可以省略,即写成int j=0;是一个意思*/
static k=1;/*块静态局部变量*/
i++;
j*=i;
k*=i;
printf("j=%d,k=%d/n",j,k);
}while(i<5);
printf("k=%d/n",k);/*这句是错误的,因为它试图读取内层块的局部变量k,运行时应该注释掉*/
getch();
}
在后面的章节,我们会专门说明静态变量的作用。
函数级的变量:同样相当于最严密的绝密级保护,变量定义在某个函数的"{"处,,就是函数级的变量。它只能被定义它的函数中的语句读写;在函数内部定义变量时,你可以在变量的定义语句前面加上如下3个词之一:(1)、auto(2)、register(3)、static局部变量。我们看到函数级和块级的种类是完全相同的.一对{}就像复合语句或函数的外壳一样,保护着它内部定义的变量不被外界存取.
文件级的变量:相当于机密级,当我们的变量定义在所有函数之外,也就是你定义了一个全局变量,之后,在全局变量定义语句的最前面加上static,就是static(静态)全局变量。这种变量的读写权限比起函数级的变量进一步放松了,即从函数级扩大到文件级。
工程级的变量:相当于公告级,当我们的变量定义在一个文件的所有函数之外,也就是你定义了一个全局变量,我们知道,函数之外定义的变量是全局变量,当你的全局变量的定义语句前不用static限定时,那么全局变量可以被你的工程中的每一个函数读取和修改。而上面冠以static的全局变量只能被他所在文件的函数读写。这就是static全局变量和全局变量的区别所在,本章的例子----程序5中的变量a,b就是全局变量。当然如何在定义全局变量的文件之外使用该全局变量,还是有些麻烦的,详见后面关于可见性的描述。
还有一些概念,进一步描述一下::
块级和函数级的变量,在定义它的{}中,可以使用,或者说只有定义它的{}可以看见它,{}之外不可见,不可使用。
文件级的变量,在定义它的文件中,可以使用,或者说只有定义它的文件中的函数可以看见它,其他文件中的函数见不到它。
工程级的变量,在定义它的工程中,可以使用,或者说只要是工程函数都有可能可以看见它,即对所有文件中的函数公开.注意有可能这3个字,将会引出extern的讲解(To be continued............)。
如此我们就有了变量可见性的概念,可以看出,由于定义位置不同,因而变量受到不同级别的保护,于是可见性就不同了.
变量可以被见到,就可以被使用,或者说变量就可以被存取,我们说变量此时起作用了,
一般的函数级的变量,在定义它的函数中,起作用,
一般的文件级的变量,在定义它的文件中,起作用,
一般的工程级的变量,在定义它的工程中,起作用,
我们看到各种级别的变量起作用的区域时不同的,这就是所谓作用域的概念. 我们看到作用域有大有小,作用域也有4个,从大到小是:工程区域、文件区域、函数区域、块区域。这4个区域存在包含的关系。我们说块在最内层,而工程区域在最外层。
变量的可见性和它的作用域大部分情况下是一致的,但是也存在这种情况,即在内层块中定义的变量,隐藏了外层块中同名的变量。一般情况下,没有办法引用被隐藏的变量。
上一节我们在全局变量和局部变量难以取舍的矛盾中结束,其实在现实世界中,存在着许多矛盾,他们是如此的对立,但是又同时存在,缺一不可.
比如:生和死,甜和苦,真和假,男和女,笑和苦,实在是太多了,他们是对立着,同时又统一着,不是吗?人分男和女;人人生娃,都想要男的,没有女娃可以吗?哈哈,矛盾啊矛盾!!!
我要说的就是局部变量和全局变量各有优点,我们都需要;不一定要否定掉其中的一个,只不过到底用哪一种,需要我们程序员自己选择罢了.也就是变量该如何被共享和保护应该由程序员自己决定,而且必须能由程序员决定;对于一个变量,程序员必须有足够的权利去决定,它让哪些程序或函数使用,同时又不让哪些程序或函数使用.
于是在C程序设计中,采用了变量分级保护的思想。什么是分级保护的思想呢?举个例子吧:
对于我个人,有些事情,除了自己,不想让任何人知道的,这样的信息就是我的绝密!而有些事情,除了家人,就不想让外人知道了,这样的信息对我来说就是机密!另外的一些事情,是可以让任何人知道的,这样的信息就是公告了!我们常说:该你知道的,告诉你;不该你知道的,别打听,否则会大祸临头的.个人的信息就这样被我简单的分成了3个保密级别:绝密、机密和公告。这就是我所谓的信息分级保护的思想。更确切的说是分区域或分范围的保护,这里的范围有3个:个人、家庭、全社会。我的信息受到了分级思想的保护,从而不会被不该知道的人知道。
回到C程序设计中来,我们的变量作为程序中的信息,也应能被分级保护;而在第2节中,我们说到程序分4级:工程---文件---函数---复合语句块,因此变量根据定义位置的不同,分4级进行保护,使其不被不该使用它的程序见到它,或者说存取它。
详细的,在C程序设计中,我们为变量设定的4级保护是:
块级的变量:相当于最严密的绝密级保护,变量定义在某个块的"{"处,就是块级变量。它只能被定义它的复合语句块中的语句读写;在块内部定义变量时,你可以在变量的定义语句前面加上如下3个词之一:(1)、auto (2)、register (3)、static。 auto说白了就是普通变量,以前我们定义的变量全部是auto变量,写不写auto无所谓。register是寄存器局部变量,初学者不必理解和使用它.而在变量的定义语句加上static后,该变量就定义成了静态的块局部变量.
举例如下:
#include<stdio.h>
void main()
{
auto int i=1;/*函数局部变量*/
do
{ auto int j=1;/*块局部变量,auto可以省略,即写成int j=0;是一个意思*/
static k=1;/*块静态局部变量*/
i++;
j*=i;
k*=i;
printf("j=%d,k=%d/n",j,k);
}while(i<5);
printf("k=%d/n",k);/*这句是错误的,因为它试图读取内层块的局部变量k,运行时应该注释掉*/
getch();
}
在后面的章节,我们会专门说明静态变量的作用。
函数级的变量:同样相当于最严密的绝密级保护,变量定义在某个函数的"{"处,,就是函数级的变量。它只能被定义它的函数中的语句读写;在函数内部定义变量时,你可以在变量的定义语句前面加上如下3个词之一:(1)、auto(2)、register(3)、static局部变量。我们看到函数级和块级的种类是完全相同的.一对{}就像复合语句或函数的外壳一样,保护着它内部定义的变量不被外界存取.
文件级的变量:相当于机密级,当我们的变量定义在所有函数之外,也就是你定义了一个全局变量,之后,在全局变量定义语句的最前面加上static,就是static(静态)全局变量。这种变量的读写权限比起函数级的变量进一步放松了,即从函数级扩大到文件级。
工程级的变量:相当于公告级,当我们的变量定义在一个文件的所有函数之外,也就是你定义了一个全局变量,我们知道,函数之外定义的变量是全局变量,当你的全局变量的定义语句前不用static限定时,那么全局变量可以被你的工程中的每一个函数读取和修改。而上面冠以static的全局变量只能被他所在文件的函数读写。这就是static全局变量和全局变量的区别所在,本章的例子----程序5中的变量a,b就是全局变量。当然如何在定义全局变量的文件之外使用该全局变量,还是有些麻烦的,详见后面关于可见性的描述。
还有一些概念,进一步描述一下::
块级和函数级的变量,在定义它的{}中,可以使用,或者说只有定义它的{}可以看见它,{}之外不可见,不可使用。
文件级的变量,在定义它的文件中,可以使用,或者说只有定义它的文件中的函数可以看见它,其他文件中的函数见不到它。
工程级的变量,在定义它的工程中,可以使用,或者说只要是工程函数都有可能可以看见它,即对所有文件中的函数公开.注意有可能这3个字,将会引出extern的讲解(To be continued............)。
如此我们就有了变量可见性的概念,可以看出,由于定义位置不同,因而变量受到不同级别的保护,于是可见性就不同了.
变量可以被见到,就可以被使用,或者说变量就可以被存取,我们说变量此时起作用了,
一般的函数级的变量,在定义它的函数中,起作用,
一般的文件级的变量,在定义它的文件中,起作用,
一般的工程级的变量,在定义它的工程中,起作用,
我们看到各种级别的变量起作用的区域时不同的,这就是所谓作用域的概念. 我们看到作用域有大有小,作用域也有4个,从大到小是:工程区域、文件区域、函数区域、块区域。这4个区域存在包含的关系。我们说块在最内层,而工程区域在最外层。
变量的可见性和它的作用域大部分情况下是一致的,但是也存在这种情况,即在内层块中定义的变量,隐藏了外层块中同名的变量。一般情况下,没有办法引用被隐藏的变量。
- 第8章 函数(五)变量的分级保护
- 第8章 函数(八)函数的分级保护
- 第8章 函数(四)变量的保护与共享
- 关于涉密信息系统分级保护的几个问题
- 关于信息安全制度中等级保护与分级保护的异同
- 第12章 存储器的保护
- 第8章 函数(三)全局变量和局部变量的概念
- 第8章 函数(七)戏说变量的生存期
- 第8章 函数(六)共享局部变量
- 《基于ORACLE的SQL优化读书》笔记 绑定变量分级
- 对类的私有变量起保护作用的访问函数
- 国家分级保护规范要求解读
- 保护无线网络的五大技巧
- static变量保护作用的探讨
- 如何访问一个类的保护变量
- 第5章 在保护模式中调用C语言函数
- 并行调用一个函数时,局部变量无需加锁保护
- 第8章 指针 ——指针变量做函数参数
- 网易CEO丁磊:我为什么关注养猪
- 第8章 函数(八)函数的分级保护
- 系统程序员成长计划-Write once, run anywhere(WORA)(上)
- 第8章 函数(九)拾遗
- 第8章 函数(七)戏说变量的生存期
- 第8章 函数(五)变量的分级保护
- Mplayer make出错。
- 第8章 函数(二)工程的诞生
- 系统程序员成长计划-Write once, run anywhere(WORA)(下)
- 第8章 函数(十) 小结
- 第9章 预处理命令
- 第10章 指针(一) 内存地址单元
- 第10章 指针(二) 首地址----------指针
- 第10章 指针(三)对地址进行分类------指针类型