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 ∑
}
//返回动态内存分配地址
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 ∑
}
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 2022-11-13 09:41 会飞的鱼-blog 阅读(36) 评论(0) 编辑 收藏 举报 来源
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?