所有的数据都有两种类型
数据类型:
如 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; }