5、变量属性(auto、register、static、extern)

前言

狄泰软件唐老师的个人学习笔记

1、auto关键字

  • auto即c语言中局部变量的默认属性
  • auto表明被修饰的变量存在于栈上

2、register关键字

  • register关键字是将局部变量存储于 寄存器 中,而不是内存
  • 变量很多,寄存器是有限的,因此,register是请求寄存器变量,但不一定请求成功
  • 不能用 & 运算符获取 register 变量的地址(&获取的是内存地址,而不是寄存器地址)

实验:验证不能用 & 获取 register 的地址

#include <stdio.h>

//	register int i; 
//	register 一般用于修饰局部变量,修饰全局变量会使得占用寄存器时间过长 
int main()
{
	register char var;
	 
//	printf("0x%08X", &var);	//error
	
	return 0;
}

3、static 关键字

变量

  • 全局变量:具有全局作用域,全局变量只需在一个源文件中定义,如果程序包含( include )多个文件的话,就可以作用于所有的源文件。
  • 静态全局变量:具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它只作用于定义它的文件里,不能作用到其它文件里,即被 static 关键字修饰过的变量具有文件作用域。
  • 局部变量:具有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。
  • 静态局部变量:具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,改变了变量存储区,不会更改变量作用域(看下面例子)。

函数

  • 静态函数用来表示不能被其它文件访问的一个函数(和用static修饰全局变量的目的一样,都是不允许其它文件访问)。这样一来便有一个好处:程序员不用担心自己编写的函数与其他文件的函数同名。

实验:三个关键字的使用

#include <stdio.h>

int f1()
{
	int r = 0;
	r++;
	return r;
}
int f2()
{
	static int r = 0;
	r++;
	return r;
}
int main()
{
	auto int i = 0;		//auto写不写都行,i为局部变量,栈变量 
	static int k = 0;	//static修饰局部变量,存储于静态数据区,作用域在main中 
	register int j = 0;	//向编译器申请将 j 存储于寄存器
	
	printf("%p\n", &i); 
	printf("%p\n", &k); 
//	printf("%p\n", &j);	//error,&是取内存地址,不能取寄存器里的
//两个变量连着定义,他的地址是连着的,但是加了关键词后的变量地址完全不相关,
//说明,他们的存储不在一个地方
	for(i=0; i<5; i++)
	{
		printf( "%d\n", f1() );	//1 1 1 1 1
	} 
	for(i=0; i<5; i++)
	{
		printf( "%d\n", f2() );//1 2 3 4 5
	} 
	return 0;
}
  • static 修饰局部变量,改变了变量的存储区,但没有改变作用域,在 f1 函数加上k,依然是没定义

4、extern

  • extern用于声明"外部"定义的变量和函数,

    • 这个变量(函数)是在文件的其他地方分配空间(定义),我要用,但是不想重复定义
  • extern是C语言和C++语言的桥梁,C++语言要兼容C,
    在这里插入图片描述
    在c++环境中,加上extern这句,表示一下代码按照C语言的方式编译

  • 全局变量用 static 修饰,那再用 extern 也没用

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值