1、宏替换,肯定只能用#define了,比如:#define PI 3.14
2、给简单数据类型起别名:#define uint32 unsigned int 或 typedef unsigned int uint32;其实这两个是一样的。
3、声明一个指向简单数据类型变量的指针,比如我们这样定义 #define uint32_p unsigned int * 如果我们只用来声明一个指针变量是没问题的,但是要是出现这样一种情况:uint32_p p1,p2;结果会怎样呢?根据#define替换的功能,可以解析成
unsigned int *p1,p2;而这个声明的作用与我们之前的目的是完全不一样了吧。而如果我们换成了typedef unsigned int * uint32_p;uint32_p,是一种新的数据类型,完全可以用它去声明uint32_p p1,p2;
例子:
定义如下:
#define PCHAR1 char*
typedef char* PCHAR2;
举例说明如下:
PCHAR1 pc1, pc2;
PCHAR2 pc3, pc4;
上面两行语句目的是想把pc1、pc2、pc3、pc4都定义成指向char型数据的指针,结果pc2不符合定义成指针的预期,其实际为char型普通变量,其它三个为指针变量,符合预期。
为什么导致这个结果呢?原因很简单,define就是一个宏定义,在编译预处理阶段直接字符串替换,直接将PCHAR1替换成char*,替换后变成如下形式:
char * pc1, pc2;
很显然,pc1是指针变量,pc2为普通变量。
5.(*(void
(*)())0)();我们知道void(*)()这是一个函数指针类型的声明,声明了一个指向返回值类型为void的函数的函数指针,函数指针指向的函数的地址为0地址,最后(*0)();调用内存地址为0的那个函数,假如我们在程序的其它地方也会用到void
(*)(),我们是不是考虑一下,用typedef void (*A)()当我们再要定义返回值类型为void
类型的函数指针时只用写:A a;
,
#include <stdio.h> int Max(int a,int b){ return a>b?a:b; } typedef int(*HANDLER)(int,int); HANDLER Fun(int a,int b,HANDLER pfun){ printf("Max value=%d\n",pfun(a,b)); return pfun; } void main(){ Fun(10,20,Max); }
微信扫码关注
更新实时通知