C语言学习记录——复习数据存储类别(auto、register、static、extern)

目录

 

存储类别的概念及存储方式

存储类型修饰符

auto(自动变量)

register(寄存器变量) 

static(静态变量) 

extern(外部变量)


 

存储类别的概念及存储方式

指变量在内存中的存储方式。

分为:

静态存储方式:指在程序运行期间分配固定的存储空间;

动态存储方式:指在程序运行期间根据需要动态分配存储空间。

 

存储类型修饰符

在C语言中,提供了4种存储类型修饰符:

auto(自动变量)

概念:

自动存储类型修饰符auto指定了一个局部变量为自动的,每次执行到定义该变量的语句块时,都动态地分配存储空间,即数据存储在动态存储区中。

定义形式:

[ auto ] 数据类型 标识符 变量名1,变量名2...... 变量名n;

我们通俗易懂一点:

{
	int c, x, k;
	char arr;
	...
}

 等价于

{
	auto int c, x, k;
	auto char arr;
	...
}

自动变量的特点:

一:

其作用域仅限于定义该变量的函数或复合语句内

当函数或符合语句运行结束之后,该变量的生命周期也结束,被销毁,其中的值也不能保留

二:

遵循“作用域小的变量屏蔽作用域大的同名变量”的原则

特点一举例: 

#include <stdio.h>

fun(int a, int b, int c)
{
	c = a * b;
}
int main()
{
	auto int c = 0;
	fun(2, 3, c);
	printf("%d\n", c);
	return 0;
}

最终运行结果为:  0  

 特点二举例:

 

#include <stdio.h>
int ji = 114;
int main()
{
	auto int ji = 514;
	printf("%d\n", ji);
	return 0;
}

最终运行结果为: 514 

 

register(寄存器变量) 

了解寄存器变量之前,应该先清楚一下寄存器的概念。

寄存器是CPU内部的元件,包括通用寄存器、专用寄存器和控制寄存器。寄存器拥有非常高的读写速度。

寄存器变量,即把变量存放在CPU中的寄存器中。

而先前的auto变量的值则是存放在内存单元中的。 

定义形式:

[ register ] 数据类型 标识符 变量名1,变量名2,...,变量名n;

 好理解一点地说:

用register修饰变量可以提高程序运行的速度。

 

寄存器变量的特点:

一:

CPU中寄存器的数量有限,只能将使用频率高的变量设置为register型。如果没有足够的寄存器来存放指定的变量,或者编译程序认为指定的变量不适合放在寄存器中时,就会被自动设为auto型。

二:

由于寄存器变量是放在寄存器中而不是内存中,因此这种类型的变量没有地址,不能对它进行求地址运算。  

三:

寄存器的长度一般与机器的字长(是指计算机能直接处理的二进制数据的位数,它决定了计算机的运算精度。)相同,所以数据类型为float、long、double的变量通常不能定义为register型,只有int、short、char类型的变量可以定义为register型。 

 值得一提的是:register说明只是对编译程序的一种建议,不是强制的。

 

static(静态变量) 

此类变量存放在静态存储区里。一旦为其分配了存储单元,那么在整个程序运行期间,其占用的存储单元将固定存在,不会被系统释放掉,直到程序运行结束,因此静态变量也称为永久存储变量(或内部变量)。

定义形式:

[ static ] 数据类型 标识符 变量名1,变量名2,...,变量名n; 

static可以用来修饰局部变量、全局变量和函数:

一.修饰局部变量

使得局部变量出作用域时不被销毁,改变了局部变量的生命周期(本质上是改变了存储类型,由栈区变为了静态区)。 

二.修饰全局变量

使得全局变量只能在自己所在的源文件内部使用。全局变量在其他源文件内部可以使用,是因为其具有外部链接属性,被static修饰后,就变成了内部链接属性。

三.修饰函数

与修饰全局变量相同,本质上都是改变了链接属性。 

static修饰局部变量举例

#include <stdio.h>
int func()
{
	static int x = 3;
	return x;
}
int main()
{
	printf("%d\n",func());
	return 0;
}

最终运行结果为:  3 

static修饰全局变量和函数,一般用于有众多源文件的大型程序,这里不多做举例。  

可参考我曾学习和发布的扫雷小项目,其中有用到static修饰自定义函数

 

extern(外部变量)

概念:

在函数外定义的变量就是外部变量,因此外部变量就是全局变量,它的作用域和生命周期与全局变量完全相同。外部变量和全局变量指的是同一类变量。

但需要明确的是, 全局变量是从作用域的角度提出的,外部变量是从存储方式的角度提出的。

定义形式:

[ entern ] 数据类型 标识符 变量名1,变量名2,...,变量名n;

例如:

	y = 5;
	y_ = 2;
	t = 1;

#include <stdio.h>
int main()
{
	extern int y, y_,t; //外部变量的定义
	printf("%d%d%d", y, y_, t);
	return 0;
}

最终运行结果为: 521 

在 较大型的C程序设计中,一个源程序往往由多个源文件组成,如果一个源文件中定义的全局变量在另外的源文件也要使用到,则需要用extern对该全局变量进行说明。

例如:

test1.c文件中: 

int z, n;
int main()
{
	......
}

test2.c文件中:

//该源文件中需要用到上个源文件的两个全局变量
extern int z, n;  //故而需要对这两个变量进行声明
int max()
{
	if(z < n)
	......
}

 

暂时就这样

over 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值