C语言再学习2——auto&register&static

前言:

为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长。

在这里插入图片描述


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 修饰局部变量);二是用来表示不能被其他文件访问的全局变量和函数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值