前言:
为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长。
1. auto
编译器默认的缺省情况下,所有变量都是 auto 的。
auto 修饰的变量,意味着变量当前的作用域为当前函数或代码段的局部变量,意味着当前变量会在内存栈上进行分配。
查了一些资料,发现都是说:编译器在默认的缺省情况下,所有变量都是auto 的。 然而,对全局变量,局部变量用 auto 修饰时,发现全局变量是有问题的,推测是全局,局部变量的生命周期,存储位置不一样导致的问题。更严谨的说法应该是指 auto 修饰的变量的作用域或者生命周期尽在函数内部,如果不显式声明这个变量,其初始值是不确定的,而全局变量不显式声明,其初始值自动设置为 0。
2. register
寄存器定义的变量,请求编译器尽可能把变量定义在 CPU 内部的寄存器而不是通过内存寻址访问以提高效率。
寄存器其实就是一块一块小的存储空间,只不过其读取数据比内存快的多。
register 变量必须是能被 CPU 寄存器接受的类型。意味着 register 变量必须是一个单个的值,并且其长度应小于或等于整型的长度,且 register 变量可能不放在内存中,故不能用去地址运算 “&” 来获取 register 变量的地址。
寄存器的长度一般和机器的字长一致,所以,只有较短的类型如 int、char、short 等才适合定义为寄存器变量,如 double 等较大的类型,不推荐将其定义为寄存器类型。
3. static
3.1 作用一
修饰变量(局部 + 全局),都存在于内存的静态区。
静态全局变量: 作用域限制在变量被定义的文件中,其他文件即使使用 extern 声明也无法反问它。作用域是从定义开始到文件结束,习惯上把定义在文件的顶端,这样整个文件都可以使用,如果是定义在了文件的中间位置,定义之前的依旧不能够使用它。
静态局部变量: 在函数体内定义,只能在当前的函数内使用,同文件的其他函数也使用不了。因为 static 修饰的变量总是存在静态区,所以当这个函数运行结束,这个静态区的值依旧不会被销毁,函数下一次使用还是这个值。
测试程序:
#include<stdio.h>
#include<stdlib.h>
static int j = 0;
int k = 0;
void Static_Test(void)
{
static int i = 0;
j = 0;
k = 0;
i++;
k++;
j++;
printf("i = % d ,j = %d,k = % d\r\n", i, j, k);
}
int main(void)
{
int cnt;
for (cnt = 0; cnt < 10; cnt++)
{
Static_Test();
}
system("pause");
//getchar();
return 0;
}
测试结果:
局部变量使用 ststic 修饰后,虽然函数内部依旧有 static int i =0 ;初始化语句,但变量的值依旧是上一次运行保存的值,不会重新变为 0 ;而全局变量(无论是否有 ststic 修饰)在函数内部重新赋值为 0 后,再次重新初始化为了 0。
3.1 作用二
修饰函数: 函数前加上 static 使得函数成为静态函数。表示函数的作用域仅仅局限于本文件(又称内部函数)。
优势: 可以防止不同文件相同函数名之间的冲突。
C 引入 static 一是为了表示退出一个块后仍然存在的局部变量(static 修饰局部变量);二是用来表示不能被其他文件访问的全局变量和函数。