简述静态全局变量的概念
在全局变量前加上static关键字,就定义了一个静态全局变量。通常情况下,静态全局变量的声明和定义放在源文件中,并且不能使用extern关键字将静态全局变量导出,因此静态全局变量的**作用于仅限于定义静态全局变量所在的文件内部。**普通全局变量的作用于是整个工程,在头文件中使用extern关键字声明普通全局变量,并在源文件中定义,其他文件只要使用#include包含声明普通全局变量的头文件,就可以在当前文件中使用普通全局变量。
static int sgn; //首先定义一个静态全局变量,在main函数中赋值
void increaseSG(){sgn++;}
int main(){
sgn = 10; //表明在main函数中静态全局变量可见
cout<<sgn<<endl;
increaseSG(); //调用increaseSG()函数进行自增操作,表明静态全局变量在函数中也是可见的
cout<<sgn<<endl;
getchar();
}
如果在头文件中声明静态全局变量,静态全局变量在声明的同时会被初始化,如果静态全局变量没有显式地初始化则会初始化为默认值,相当于在头文件中同时完成声明和定义,而普通全局变量不能直接定义在头文件中。
sizeof的使用
在C语言中,可以通过sizeof运算符获取其操作数所占内存空间的字节数。需要注意的是,sizeof是一个单目运算符,并不是一个函数。在使用sizeof运算符时,其操作数可以是类型名,也可以是表达式。如果是类型名,则直接获得该类型的字节数;如果是表达式,则先分析表达式结果的类型,再确定所占字节数,而并不对表达式实际进行计算。
int a = 3;
double b = 7.5;
sizeof(int); //result is 4
sizeof(a); //result is 4
sizeof(b); //result is 8
sizeof(a+b); //result is 8
虽然对表达式进行sizeof运算时可以不加括号,但推荐使用带括号的书写方式。在实际应用中,很少单独使用sizeof运算符计算某一个类型或表达式所占的字节数,通常使用sizeof运算符都是与内存分配或计算数组长度等需求配合使用。
在申请内存空间时,可以使用sizeof运算符加上类型名作为分配空间的基数。
int *ptr = (int*)malloc(sizeof(int)*20);
在计算数组中元素的个数时,可以使用sizeof运算符加上数组元素类型作为基数。
int count = sizeof(darray)/sizeof(double);
其中daaray是一个数组名,将数组名作为sizeof运算符的操作符可以获得整个数组所占的空间。如果darray作为实参传递给子函数,子函数中形参对应的参数已经变为指针,而对指针使用sizeof运算符只能获取指针本身所占的字节数。
void main(double darray[])
{
cout<< sizeof(darray)/sizeof(double) <<endl; //output: 4/8=0
}
int main()
{
double darray[20];
cout<< sizeof(darray)/sizeof(double) <<endl; //output: 160/8=20
}
注意:不要使用sizeof运算符计算字符串的长度,计算字符串长度应该使用strlen函数。sizeof函数一个运算符,用于获取类型或表达式所占内存的大小;strlen是一个函数,用于计算字符串中字符的个数,其中字符串结束符\0不会被计算在内。