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

简介: C语言学习记录——复习数据存储类别(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

目录
相关文章
|
7天前
|
C语言
【C语言】:static和extern的详细介绍和使用
【C语言】:static和extern的详细介绍和使用
13 1
|
6天前
|
存储 编译器 C语言
c语言学习历程【1】
c语言学习历程【1】
8 1
|
7天前
|
存储 程序员 Go
|
25天前
|
测试技术 C语言
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
17 1
|
25天前
|
C语言
C语言学习记录——动态内存开辟常见的错误
C语言学习记录——动态内存开辟常见的错误
13 1
|
5天前
|
C语言
|
7天前
|
C语言
|
7天前
|
C语言
|
7天前
|
C语言
|
7天前
|
C语言