前言
狄泰软件唐老师的个人学习笔记
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 也没用