所有的变量默认为auto(自动,全局),将不再类,结构体,枚举,联合体,函数中定义的变量视为全局。
建议编译器变量存在寄存器中:register–>建议编译器将变量存储在寄存器中以提高效率,针对使用频繁的变量。
建议编译器不要去寄存器中取值:volatile–>防止被系统优化(值存入寄存器),让编译器重新从内存地址中取值,不要在 寄存器中取值,多用在多线程,中断服务程序中。
内部使用:static–>静态变量,限制作用域,存储在常量区。作用:(1).统计函数被调用的次数,(2)将局部变为静态局部变量(有全局的特性,作用域局部),(3).修饰全局不能被别的程序extern,限制当前文件内部使用。
外部调用:extern–>意为外来的,告诉编译器函数可能存在某一个源文件中。
const–>防止初值被修改,修饰紧跟着它的内容
int a=10, b=20;
const int *p=&a;
(1)*p = 20; //错误的
(2)p=&b;
(3)a=100;
int a=10, b=20;
int const *p=&a;
(1)*p = 20; //错误的
(2)p=&b;
(3)a=100;
int a=10, b=20;
int * const p=&a;
(1)*p = 20;
(2)p=&b;//错误的
(3)a=100;
typedef —》给复杂数据类型取别名(外号)–》王苟胜–》狗蛋
typedef unsigned int u32_t;
unsigned int a; 《==》 u32_t a; //两者之间是等价的
typedef unsigned char u8_t;
unsigned char b; 《==》 u8_t b; //两者之间是等价的
typedef void (*sighandler_t)(int);
sighandler_t p; <==> void (*p)(int); //两者之间是等价的
typedef struct stu
{
int a;
char b;
}STU, *STU_P;
数据类型 +变量名 数据类型 +变量名
struct stu lisi; <==>STU lisi; //两者之间是等价的
struct stu *p; <==>STU_P p; //两者之间是等价的
带参宏:–>带参宏变量运算一定加括号,不然会有运算符优先级问题
#define MAX(a, c) a>b?a:b
用宏定义写出swap(x,y),即交换两数。
#define swap(x,y) int a;a=x;x=y;y=a;
#define swap(x,y) (x)=(x)^ (y); (y)=(x)^ (y); (x)=(x)^ (y);
#define swap(x,y) (x)=(x)+(y); (y)=(x)-(y); (x)=(x)-(y);
#define arry_len(table) sizeof(table)/sizeof(table[0]) --》数组所占字节数/数组元素所占的字节数
char b[20];
printf("%d\n",arry_len(b));
例子:
若有宏定义:#define MOD(x,y) x%y
则执行以下语句后的输出结果是
int a=13,b=94;
printf(″%d\n″,MOD(b,a+4));
A.5
B.7
C.9
D.11
因为#define MOD(x,y) x%y是在运行时直接代入计算。
所以实际上计算的结果是MOD(b,a+4),即printf(″%d\n″,b%a+4);
b%a=3,所结果是3+4=7