static使用相关详解
//01static.cc
#include<iostream>
using namespace std;
void Test1()
{//局部静态变量
//---1.只能使用在该函数作用范围,就是说在该函数函数体内可以使用(必须在定义结束后)
//---2.若重复调用该函数,由于该静态变量a只定义一次,数据会使用改变了的
//---3.与普通局部变量的区别:静态局部变量只有当程序结束才释放内存,而普通局部变量在对应函数执行完就释放内存
//---4.注:如果在定义局部变量时不赋初值的话,对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。
//-----而对自动变量来说,如果不赋初值则它的值是一个不确定的值,且之后调用的时候会被当成静态变量使用。与第三点有些冲突请注意!
//--- 所以对于普通局部变量一定要初始化!
static int a;
a++;
int b=0;//存储类型关键字auto修饰:auto register static extern
b++;
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
return;
}
int main(int argc,char**argv)
{
Test1();
Test1();
Test1();
//cout<<"a="<<a<<endl;
return 0;
}
//02static.cc
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
static int a=0;
int b=10;
void Test1()
{//全局静态变量
//---1.存放于静态存储区
//---2.与静态局部变量的区别:都是当程序结束才释放内存,但两者的作用范围不一样,全局 > 局部
//---3.与普通全局变量的区别:都加了extern关键字说明,但静态的多个static
a++;
printf("a=%d\n",a);
return;
}
int main(int argc,char**argv)
{
printf("a=%d\n",a);
Test1();
Test1();
Test1();
return 0;
}
//03static.cc 03static.h 03main.cc
#include"03static.h"
void Test()
{
b++;
printf("b=%d\n",b);
printf("addr b=%p\n",&b);
return ;
}
int Test1()
{
printf("b=%d\n",b);
printf("addr b=%p\n",&b);
printf("a=%d\n",a);
printf("addr a=%p\n",&a);
return b;
}
#ifndef _03STATIC_H
#define _03STATIC_H
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
static int b=10;
extern int a;
void Test();
int Test1();
#endif
#include"03static.h"
int a=10;
/*
全局静态变量用于外部文件中
相当于重新定义,只是因为加了static不会出现重复定义的问题
但是查看一下两个地址就发现地址不一样,后面一个是0Xxxxx58,另一个是0Xxxxx5c,多了4个字节(相当于一个int的大小)
所以
1.想要使用外部文件中的值最好使用返回值取出来,或者用实参 以传地址传参方式传出来
2.想要使用外部文件(03main.cc)的变量,最好在欲使用区域的头文件(03static.h)里 加上extern声明,经过查看发现两个变量的地址一样
注:要使用的变量的文件(如果有的话)要包含进该头文件,如果没有可以在进行编译的时候将前者加上
*/
int main(int argc,char**argv)
{
printf("addr a=%p\n",&a);
b=Test1();
printf("b=%d\n",b);//10
printf("addr b=%p\n",&b);
return 0;
}