宏定义参数没有类型判断,宏定义在编译的时候就已经计算好了,所以效率比一般函数要高。

#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 是常量


 

递归求N!