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;
}




posted @ 2015-09-07 11:17  cloudren2020  阅读(107)  评论(0编辑  收藏  举报