《2017年11月5日》【连续026天】
标题:全局,局部,静态变量和变量的作用域,生存期;
内容:A.观看MOOC10.2,10.3;
B(a).局部变量:定义在函数内部的变量(包括函数的形参),全局变量:定义在函数外面的变量
全局变量在所有函数中均可使用,局部变量只能在定义它的函数内部使用;
全局变量都是静态变量。定义局部变量时,加“static”,该变量也成为静态变量;
静态变量的存放地址,在整个程序运行期间,都是固定不变的;
非静态变量(一定是局部变量)地址,在函数的一次执行期间不变,每次函数调用时都可能不同;
未明确初始化时,静态变量会被自动初始化成全0(每个bit都为0),非静态变量的值随机;
void Func()
{
static int n = 4; //静态变量只初始化一次
cout<<n<<endl;
++n;
}
int main()
{
Func();Func();Func();
因为静态变量只输出一次,所以当第一次所以Func函数定义n后,以后的Func将不在定义n;
静态变量应用:
strtok的实现(strtok函数详见023day)
char *Strtok(char*p,char*sep)
{
static char*start; //本次查找子串的起点
if(p) //如果p不为空指针,则是第一次调用Strtok ,故后续调用Strtok第一个实参必须是NULL
start=p;
for(;*start&&strchr(sep,*start);++start);
if(*start==0)
return NULL;
char *q=start;
for(;*start&&!strchr(sep,*start);++start);
if(*start){
*start=0;
++start;
}
return q;
}
(b).标识符的作用域;变量名,函数名,类型名统称为“标识符”,一个标识符能起作用的范围叫作用域;
使用标识符的语句,必须出现在它们的声明或定义之后,且在作用域外使用该标识符,该标识符会没有定义;
单文件的程序中,结构,函数和全局变量的作用域是其定义的整个文件;
函数形参的作用域是整个函数;局部变量的作用域是从定义它的语句开始,到包含它的最内层”}“结束;
for循环里定义的循环控制变量,其作用域就是整个for循环;
同名标识符的作用域,当大的包含小的时,在小的作用域里,大的标识符被屏蔽,不起作用;
变量的生存期:在此期间,变量占用内存空间,占用的内存空间只能归它使用,不会被用来存放其他东西;
全局变量的生存期:从程序被装入内存开始,到整个程序结束;
静态局部变量生存期:从定义它的语句第一次被执行,到整个程序结束;
函数形参的生存期:从函数执行开始,到函数返回时结束。
非静态局部变量:从执行到定义它的语句开始,到程序执行到它的作用域之外结束;
明日计划:学习选择排序和插入排序;