宏定义参数没有类型判断,宏定义在编译的时候就已经计算好了,所以效率比一般函数要高。
#define mul(a,b) ((a)*(b))
预处理指令
条件判断预处理指令,如果条件成立则预编译
#if 条件1
..code1..
#else if 条件2
..code2..
#define NUM 10
#if NUM > 0
printf("NUM>0");
#elif NUM==0
printf("NUM=0");
#else
printf("NUM<0");
#endif
return0;
如果定义了某个宏,就预处理
#define MAX 10
#ifdef MAX
..code..
#endif
#ifndef MAX
..code..
#endif
在创建一个头文件的时候都写上,重新创建一个.h文件都会自动生成这么一段的
#ifndef include_Header_h
#define include_Header_h
#end if
这样才能放心的在main函数中引用这些头文件而不担心重复引用
局部变量和全局变量
void test()
{
//全局变量和静态变量
//静态变量static修饰的也是全局变量
//b是一个局部变量,自动变量
int b=0;
b++;
//C是一个局部变量,静态变量
staticint c= 0;
c++;
printf("b=%d,c=%d\n",b,c);
}
运行结果:
b=1,c=1;
b=1,c=2;
b=1,c=3;
解释:因为b变量是局部变量,生命周期随着函数的销毁而销毁,所以在每次调用test函数的时候,b变量都被重新创建,重新赋值为0,所以每次打印出来都是1;而c变量是static变量,它被创建以后生命周期是随着程序的结束而结束的,所以在第二次调用这个函数的时候,就不需要创建c变量了,只要在原来的基础上继续添加就行了!static变量并不是在编译的时候创建的,还是在运行的过程中创建的,虽然生命周期改变,但是作用范围是不变的。
寄存器变量(register)本身也是自动变量,当函数结束时候,寄存器变量消失,当寄存器不够用的时候,会自动变成自动变量
//一开始定义的p是指向一个静态区域,不可以改变*p了
char *p="ABC";
printf("%c",*p);
*p="d";
printf("%c",*p);
void func(int *a)跟void func(int a[100])是一样的效果
int k=sizeof(a);这里k是一个指针的大小结果:k=8;
函数的形参本身就 开辟了空间 大小跟形参没有关系,好比void func(int a[10000000])随便形参数组有多大,都是一个指针的大小,如果要再func函数中计算main函数中传过来的数组空间的大小,那只能是char形式的,用strlen(p)来计算(char *p)
//
int main(int argc, constchar * argv[])
{
int a[]={2,3,4,5,6,7};
int *p=&a[0];
printf("%d ",*p);
p=&a+1;
printf("%d ",*(p-1));
p=&a;
printf("%d ",*p);
printf("%d ",sizeof(&a));
printf("%d ",sizeof(&a+1));
p=(int *)(&a+1);
printf("%d ",*(p-1));
return0;
}
结果:2 7 2 8 8 7 这里&数组名 是指数组的整个大小
const 是常量