C语言——全局变量、静态本地变量、宏定义
充实每天的第3个8小时!
原来我之前所见到的变量大部分都是定义在函数内部的本地变量(进入函数它就才出现,出了函数就不存在了)
全局变量
1、定义在函数外的变量—全局变量
1>生存期、作用域为全局!
2>所有的函数都可以使用、访问。
2、全局变量的初始化:
1>没有做初始化的全局变量编译器会自动为它分配0值。(而本地变量是随机的一个值!)
2>没有初始化的全局指针会得到NULL值。
3>只能使用 编译时的已知值 来初始化全局变量
#include <stdio.h>
int gall = 1;//定义了一个全局变量gall 值为1
int gall2 = gall;//这句不行!!!是错误的,因为编译时gall算是未知量
int main(void)
{
......
return 0;
}
4>其初始化发生在 main()函数之前
5>不要用全局变量们之间有一些赋值、运算等关系。因为我们可能会有文件调用,这时可能会出现错乱(顺序什么的)
比如在main之前:
const int gall = 12;//这里加了const后,gall的值编译时就已知
int gall2 = gall;
不要这样!!!!
2.若函数内部有与全局变量重名的变量,全局变量在函数内部会被隐藏,出来这个函数之后全局变量重新出现。
可以这么理解:在更小的地方重新定义在更大的地方曾出现过的变量时会把他隐藏掉。
静态本地变量
1.在本地变量前加一个static就会成为静态本地变量
2.离开函数是static的变量会保留其值,下次进入该函数仍为上次的值,不会重新初始化(可以理解为它的初始化是一次性的)
3.静态本地变量实际上是全局变量(可以自定义一个全局变量 一个静态本地变量 一个本地变量,然后输出他们的地址,会发现全局变量的地址和静态本地变量的地址非常接近,而和本地变量的地址差的老远了)
4.静态本地变量具有全局存在期,但是是本地作用域。
全局变量使用时应该注意的点
1.对于一个返回指针的函数
1>返回本地变量的地址是危险的,因为本地变量出了函数后就不存在了
2>返回全局变量和静态本地变量的地址是合法的
2.不要使用全局变量来在函数间传递参数和结果!!
3.尽量避免使用全局变量
4.使用全局变量和静态本地变量的函数是线程不安全的(暂时不必懂)
宏
1.编译预处理指令:
#......
1>开头为 # 号的就是编译预处理指令
2>编译与处理指令没有 ; 分号(因为它不是C语言的成分,这么理解就行了/狗头 , 但是C语言离不开它,比附include就不是C语言的关键字)
3> # define 定义宏(较老的c是没有const的,用的就是宏定义 define定义)
# define PI 3.14159
# define <名字> <值>//值可以有空格、字符等
4>在编译之前会有一步预处理
5>宏定义超过一行就要使用 \ 反斜杠
# define PRINT1 printf("hong");\
printf("hong");//这里的分号是PRINT常量里的!!!
6>宏定义可以没有值,常来被用作条件编译
7>存在着一些预定义的宏
_FILE_
_LINE_
_DATE_
_TIME_
带参数的宏
1.像函数一样的宏
#define cube(x) ((x)*(x)*(x))
如此一来就可以有:printf("%d",cube(5));
其实输出的就是((5)*(5)*(5))
2.需要注意的是:
一切都有括号!:
参数出现的每个地方都要有括号
整个值(式子)都要有括号
3.可以带多个参数(记得参数要有括号!)
4.不要加分号!!!