define和typedef都可以提一个对象取别名,目的是提升程序的可读性。
#define宏处理是预处理指令,在预处理阶段就把字符串替换过来,可以为类型取别名,但更多的是用来定义常量、编译开关、甚至成段语句;
typedef是关键字,常用来定义一个已经存在的类型的新别名。
在面试中常遇到的以下两种对指针的操作问题:
针对INT_P pi, pj;
#define INT_P int*; //展开是int *pi, pj; pj只是一个整型变量,不是指针变量。
typedef int* INT_P; //展开是 int *pi, *pj;
typedef int* INT_P;
const INT_P p=x; // 此时p是指针常量,指针p不能变,但指针指向的内容可以变。注意定义时要赋初值,不然无法再赋值了。
如果用define会直接展开成const int * p;也就是常量指针,p可以更改,但不能修改指针指向的内容。