c/c++变量四种存储类型

概述
在c和c++中所有数据都有两种类型。
1.一种是数据类型,如我们经常使用到的 int float double 等。我们在这并不讨论这种类型,当然也没有必要去那么做
2.另一种就是存储类型。其实我们在定义一个变量时,都是有前缀的,不过我们平时并不怎么关心它。总共有四种存储类型的变量,分别为自动变量(auto)、静态变量 (static)、外部变量(extern)以及寄存器变量(register)。

1.auto - 函数中所有的非静态局部变量。
在默认情况下,在代码块和函数头部定义的任意变量都属于自动变量。

void testAuto()
{
	//在c++中进行了优化,不能这样写   auto int i=0
	//它的自动在于,程序进入包含变量声明的代码块时,变量开始存在
	//当程序离开这个代码块,变量消失
	auto  i = 0;
	int j=0;//两者等效,我们一般习惯省去了auto
}

2.register -寄存器变量
一般经常被使用的的变量(如某一变量需要计算几千次)可以设 置成寄存器变量,register 变量会被存储在寄存器中,计算速度远快于存在内存 中的非 register 变量。

void testRegister()
{
	//cpu如果需要使用某个数据多次,我们都知道cpu
	//从内存中读数据很慢。寄存器变量,变量存放到
	//寄存器中,可以大大的提到cpu读取数据的速度
	register int i = 0;
	for (i; i++; i < 100000)
	{
		//todo
	}
}

注:
1.在c++中register进行了优化,我们可以不声明一个变量为寄存器变量,但当我们可能需要使用其很多次,编译器会自动进行优化,将其升级为寄存器变量。
2.在c语言中寄存器变量不可以取地址,因为其并不在内存中,但是在c++中当我们取地址时,编译器会自动将寄存器变量降为普通变量,既可以取地址。
3.寄存器变量不能定义为全局变量。

3.static-静态变量 在变量前加上 static 关键字的变量。
被声明为静态变量类型的变量,无论是局部还是全局的,都存在数据区中,其生命周期是整个程序。区别在于访问权限不一样。

//如果声明为全局静态变量
static int j = 0;

void testStatic()
{
	//则在这个文件中,自声明之后任何地方都可以访问其
	//和全局变量效果一样
	printf("%d\n", ++j);
	
	for(int k=0;k<10;k++)
	{
		static int i = 0;
		++i;
		printf("%d\n", i);//这个变量只会被声明一次
		//也就是无论循环执行多少次输出结果会一直递增1
	}
	//如果声明为局部的,虽然i这个变量一直存在
	//但是只能在其声明的代码块中访问它,
	//++i;
	
}

4.extern-外部变量
把全局变量在其他源文件中声明成 extern 变量,可以扩展该全局变 量的作用域至声明的那个文件,其本质作用就是对全局变量作用域的扩展。
全局变量:作用域从定义的哪一行开始,到文件最后一行,但是终究只是在所在源文件中。

//extern.cpp
#include<iostream>

int extern_vule = 8888;

//main.cpp
void testExtern()
{
	extern int extern_vule;
	extern_vule++;
	printf("%d\n", extern_vule);
}

注:
在extern.cpp中声明定义了 extern_vule,在main.cpp中想使用这个变量,我们需要声明extern int extern_vule;
但是不能再给这个变量赋值。
在extern.cpp中定义的extern_vule必须是全局变量才可以用extern,进而被其他文件访问到。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值