标识符起作用范围----作用域、连接类型、存储期

何谓标识符?

标识符就是人为起的一个名字。c/c++中,是你用来标识变量名、符号常量名、函数名、数组名、文件名、类名、对象名等...

1.作用。

包括一下四个分类:

a.代码块的作用域(存在于大括号之间)

b.文件的作用域(可以说这个作用域的分类完全是为了彰显全局变量在的作用而设定的,因为全局变量可以贯穿)

c.函数原型的作用域------函数声明的作用

d.函数作用域(用于goto语句使用),标志出现在函数前后都可以使用【所以即使在代码块中,但不属于代码块的作用域】

2.链接类型

a.外部链接类型----对外公开的,要求是全局变量,一般指静态变量

extern int val1;
extern void say_hello(); 

附加:extern的用法:

  extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。另外,extern也可用来进行链接指定。也就是说,定义extern int val后,编译器就会尝试到这个文件关联的文件中(一般使用include进行包含的)进行查询,查询是否有int val这样的变量定义语句。若找到即说明val在另一个文件中已经被定义,此时val就是另一个文件所定义的val。在此文件中修改它的值在另一个文件中也是有效的!

b.内部链接----本文件私有的,静态变量

1 static int var2;
2 static void say_hello();

c.无链接---局部变量,一般指函数内部的变量

3.存储期

a.自动存储期:被存放在栈。在函数内部定义的变量属于自动存储期

b.静态存储期:被存放在数据段中。全局变量属于静态存储期,另外,静态存储期也可以出现在函数内部,但是要在定义的时候加上static(如 static int c = 300;)

c.动态存储期:被存放在堆中。一般动态变量的使用时用到!

1 int * p = malloc(20);    //分配,用指针p指向匿名内存
2 free(p);        //释放所分配的匿名内存

附加   栈、堆、数据段、代码段的区别:

a.栈(stack)是保存局部变量的,函数结束,其局部变量的生命就结束了(当然是不包括static变量)。即释放了栈的空间(顺便提一下:栈特点为后进先出的!)

b.堆(heap)是操作系统申请的内存空间,需要程序主动申请,主动释放,绝大多数用到的是动态变量的使用!

c.数据段是存取全局变量何静态变量的。

d.代码段是存取代码的。

在Linux中还存在这一个BBS段!

可参考http://blog.csdn.net/jxhui23/article/details/8064766

时间: 2024-10-24 06:37:27

标识符起作用范围----作用域、连接类型、存储期的相关文章

c语言 作用域、存储期、链接属性汇总

1.作用域 块作用域:用{}阔起来的,从声明开始到"}" 结束 函数作用域:goto(标识符) 的作用域为整个函数. 函数原型作用域:函数声明开始,函数声明结束而结束 文件作用域:整个文件或者程序 2.链接 无链接:即只在其作用域内可见 内链接:即在从声明到文件结束都是可见的 外链接 :多个文件或者整个程序都可见 3.存储期 静态存储期:在整个程序都是占有内存的 线程存储期:thread_local,其声明后会给每个线程分配一个单独的私有备份 自动存储期:局部变量通常都自动为auto

《征服 C 指针》摘录2:C变量的 作用域 和 生命周期(存储期)

在开发一些小程序的时候,也许我们并不在意作用域的必要性.可是,当你书写几万行,甚至几十万行的代码的时候,没有作用域肯定是不能忍受的. C 语言有如下 3 种作用域. 1.全局变量 在函数之外声明的变量,默认地会成为全局变量.全局变量在任何地方都是可见的.当程序被分割为多个源代码文件进行编译时,声明为全局变量的变量也是可以从其他源代码文件中引用的. 2.文件内部的静态变量 就算对于像全局变量那样被定义在函数外面的变量,一旦添加了 static,作用域就只限定在当前所在的源代码文件中.通过 stat

标识符解析、作用域链、运行期上下文、原型链、闭包

本文讲到的是如何从数据访问层面上提高JS 代码的执行效率.总的来讲有以下几条原则: 函数中读写局部变量总是最快的,而全局变量的读取则是最慢的: 尽可能地少用with 语句,因为它会增加with 语句以外的数据的访问代价: 闭包尽管强大,但不可滥用,否则会影响到执行速度以及内存: 嵌套的对象成员会明显影响性能,尽量少用: 避免多次访问对象成员或函数中的全局变量,尽量将它们赋值给局部变量以缓存. 这么几句话看似简单,但要深刻理解其中的道理则需涉及到JS的 标识符解析.作用域链.运行期上下文(又称为执

静态存储期

代码: #include <stdio.h> #include <stdlib.h> void func(void); int main(void) { for (int i = 0; i < 9; ++i) { func(); } return EXIT_SUCCESS; } void func(void) { // 变量a.b均具有函数作用域 // 自动存储期(automatic storage duration) int a = 0; // 静态存储期(static s

Sort merge join、Nested loops、Hash join(三种连接类型)

目前为止,典型的连接类型有3种: Sort merge join(SMJ排序-合并连接): 首先生产driving table需要的数据,然后对这些数据按照连接操作关联列进行排序:然后生产probed table需要的数据,然后对这些数据按照与driving table对应的连接操作列进行排序:最后两边已经排序的行被放在一起执行合并操作.排序是一个费时.费资源的操作,特别对于大表.所以smj通常不是一个特别有效的连接方法,但是如果driving table和probed table都已经预先排序

编写高质量代码改善C#程序的157个建议——建议26:使用匿名类型存储LINQ查询结果

建议26:使用匿名类型存储LINQ查询结果 从.NET3.0开始,C#开始支持一个新特性:匿名类型.匿名类型有var.赋值运算符和一个非空初始值(或以new开头的初始化项)组成.匿名类型有如下基本特性: 即支持简单类型也指出复杂类型.简单类型必须是一个非空初始值,复杂类型则是一个以new开头的初始化项. 匿名类型的属性是只读的,没有属性设置器,它一旦被初始化就不可更改. 如果两个匿名类型的属性值相同,那么就认为这两个匿名类型相等. 匿名类型可以再循环中用作初始化器. 匿名类型支持智能感知. 匿名

(nginx|apache)+tomcat 几种常见的代理实现方式或连接类型(connector type)

简单描述一下nginx两块网卡,eth1外网,eth0内网与tomcat eth0通信,用户请求静态内容由nginx直接响应,动态内容则nginx转发至后端tomcat响应 安装nginx,tomcat不再描述. nginx的配置文件如下:/etc/nginx/nginx.conf [[email protected] ~]# pnginx worker_processes 1; events { worker_connections 1024; } http { include mime.ty

Unity如何判断网络连接类型

今天遇到了一个问题,如何判断手机游戏当前的网络连接类型,是wifi还是234G? 起初准备在Android中写好插件供Unity调用,后来在网上浏览众神的帖子时,在csdn上看到了使用NetworkReachability的使用方法,于是自己的安卓机完美解决,屌丝惜肾无爱疯,希望有人可以试试在ios上是否同样可用. 上代码: [code]csharpcode: using UnityEngine; using System.Collections; public class Test : Mon

Unity判断网络连接类型

使用NetworkReachability判断手机游戏当前的网络连接类型,是wifi还是234G 1 using UnityEngine; 2 using System.Collections; 3 4 public class Test : MonoBehaviour { 5 6 string str; 7 // Use this for initialization 8 void Start () { 9 if (Application.internetReachability == Net