fqy131314

C++— —变量的四种存储类型

所有的数据都有两种类型

数据类型:

如 int,float 等

存储类型:

总共有四种存储类型的变量,分别为自动变量(auto)、静态变量 (static)、外部变量(extern)以及寄存器变量(register)。

auto - 函数中所有的非静态局部变量

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

static - 在变量前加上 static 关键字的变量。

extern - 把全局变量在其他源文件中声明成 extern 变量,可以扩展该全局变 量的作用域至声明的那个文件,其本质作用就是对全局变量作用域的扩展

#include <stdlib.h>
#include <iostream>

using namespace std;

extern int extern_value;
static int yahuan_xiaoli = 24;//全局静态变量

//int yahuan_extern = 30;
//寄存器变量

void register_demo() 
{
	register int j = 0;
	printf("j: %d\n", j);
	//C++ 的 register 关键字已经优化,如果我们打印它的地址,它就变成了
	//普通的 auto 变量
	
	for (register int i = 0; i < 1000; i++) 
	{
		//....
	}

	printf("&j : 0x%p\n", &j);

	{
		int k = 100;
		k += j;
	}

	printf("register_demo - register_demo: %d\n", yahuan_xiaoli);
}
//局部静态变量
void static_demo() 
{
	static int girl = 18;
	int yahuan = 17;

	++girl;
	++yahuan;

	printf("girl: %d yahuan: %d\n", girl, yahuan);
	printf("static_demo - register_demo: %d\n", yahuan_xiaoli);
}
//外部变量
void extern_demo() 
{
	extern_value++;
	printf("extern_value:%d\n", extern_value);
}
int main(void) 
{
	int i = 0; //C 语言的 auto 不会报错,C++ auto 已经升级啦
	//register_demo();
	//static_demo();
	//static_demo();
	//static_demo();

	extern_demo();

	system("pause");
	return 0;
}

变量的作用域和生存周期

存储类别

存储期

作用域

声明方式

auto

自动

块内

register

自动

块内,使用关键字 register

static(局部)

静态

块内,使用关键字 static

static(全局)

静态

文件内部

所有函数外,使用关键字 static

extern

静态

文件外部

所有函数外

函数返回值使用指针

可以返回函数内部:动态分配内存地址 局部静态变量地址 以及全局静态变量和外部变量 地址

// demo 9-8.c
#include <iostream>
#include <stdlib.h>
using namespace std;
int* add(int x, int y)
{
	int sum = x + y;
	return &sum;
}
//返回动态内存分配地址
int* add1(int x, int y)
{
	int* sum = NULL;
	sum = new int;
	*sum = x + y;
	return sum;
}

//返回局部静态变量的地址
int* add2(int x, int y)
{
	static int sum = 0;
	printf("sum: %d\n", sum);
	sum = x + y;
	return &sum;
}
int main()
{
	int a = 3, b = 5;
	int* sum = NULL;
	//cout << add(a, b) << endl;
	//sum = add(a, b);//不能使用外部函数局部变量的地址 bad
	//接收外部函数动态内存分配的地址 ok
	//sum = add1(a, b);
	//cout<<*sum<<endl;
	//delete sum;
	//接收外部函数局部静态变量的地址
	sum = add2(a, b);
	cout << *sum << endl;
	*sum = 88888;
	add2(a, b);
	system("pause");
	return 0;
}

posted on   会飞的鱼-blog  阅读(36)  评论(0编辑  收藏  举报  

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示