【C语言】—— 《C和指针》学习笔记2

作用域

  • 代码作用域:任何在代码块的开始位置声明的标识符都具有代码作用域。
  • 文件作用域:任何在所有代码块之外声明的标识符均有文件作用域,该标识符从声明之处到所在源文件的结尾处均可被访问。
  • 原型作用域:只适用于在函数原型中声明的参数名。
  • 函数作用域:此类作用域很少被使用,希望大家最好不要使用该类作用域,它只适用于语句标签,语句标签用于goto语句。

下面我们看段代码具体来了解一下几个常用到的作用域

#include <stdio.h>

int a = 10;//a文件作用域

int funb(int b);//b原型作用域

int func(int c)//c原型作用域
{
	int d = 9;//d代码作用域
	int e;//a代码作用域
	int funf(int g, int h);//g,h原型作用域
	int funk(int i);//i原型作用域

	{
		int i,j;//代码作用域
	}
}
  • 这里我们可以看到变量a和函数funb和func都是具有文件作用域的标识符,变量b,c,g,h,i均具有原型作用域,变量d,a,i,j以及函数funf和funk具有代码作用域
  • 这里在一个源文件中我定义了好几个同名的变量,但是此时编译器是允许在不同的作用域中定义同名的变量的,而且因为作用域不同,这两个同名变量是有着不同的含义的。

链接属性

  • 标识符的链接属性决定如何处理在不同文件中出现的标识符。标识符的作用域与它的链接属性有关,但是两个属性并不相同。

    三种链接属性

  • 外部链接属性(external):属于external链接属性的标识符不论声明多少次,或是位于多少个源文件中都表示同一个实体

  • 内部链接属性(internal):属于internal链接属性的标识符在同一个源文件内所有的声明都表示同一个实体,但是位于不同的源文件的多个声明分数不同的实体。

  • 无链接属性(none):没有任何链接属性的标识符总是被当做单独的个体,也就是说该标识符不论是在同一个源文件或是不同源文件的多次声明都会被看做是独立不同的实体

还是来看段代码

typedef char*  a;//a的链接属性是none
int b;//b的链接属性是external
int func(int d)//d的链接属性是none
{
	int e;//e的链接属性是none
	int funf(int g);//g的链接属性是none
}


static int b;//b的链接属性是internal
static int func(int d)//d的链接属性是none
{
	extern int e;//e的链接属性是external
	int funf(extern int g);//g的链接属性是external
}
  • 这里我们可以看到变量a,d,e,g的链接属性都是none,变量b和函数func和funf的链接属性都是external。
  • static关键字,可以修改标识符的链接属性,如果某个标识符在正常情况下具有external的链接属性,加上static关键字就可以将它的链接属性改为internal,像第二段代码中的static int b,此时变量b将为该源文件所私有关键字static只对缺省属性为external的标识符的声明才有改变链接属性的效果
  • extern关键字,可以修改标识符的链接属性,它可以为标识符指定external链接属性,这样就可以访问在其他任何位置定义的这个实体。

存储类型

  • 变量的存储类型是指存储变量值得内存类型,变量有三种存储类型
  • 普通内存,凡是在代码块之外声明的变量总是存储在静态内存中,该类变量称为静态变量
  • 运行时堆栈,在代码块内部声明的变量的缺省存储类型是自动的,也就是说他存储于堆栈中,称为自动变量,这里也会使用到关键字static,用static修改变量的存储类型,可以将自动变量改为静态变量,但是并不改变变量的链接属性和作用域,它仍然只能在该代码块内被按名字访问。
  • 注:函数的形式参数不能声明为静态,因为实参总是在堆栈中传递给函数,用于支持递归。
  • 硬件寄存器,关键字register可以用于自动变量的声明,可以提示系统将该变量存储在机器的硬件寄存器中,但是编译器可以忽略该关键字。

static关键字

  • static用于函数定义时,或用于代码块之外的变量声明时,static关键字可修改标识符的链接属性,从external改为internal,但是标识符的存储类型和作用域不受影响。
  • static用于代码块内部的变量声明是,static关键字用于修改变量的存储类型,从自动变量修改为静态变量,但是变量的链接属性和作用域不受影响。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值