转载请注明出处:http://blog.csdn.net/21aspnet/article/details/6723915
1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。例如:
#define PI 3.1415926
程序中的:area=PI*r*r 会替换为3.1415926*r*r
如果你把#define语句中的数字9 写成字母g 预处理也照样带入。
2)typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名,但是You cannot use the typedef specifier inside a function definition。
3)typedef int * int_ptr;
与
#define int_ptr int *
作用都是用int_ptr代表 int * ,但是二者不同,正如前面所说 ,#define在预处理 时进行简单的替换,而typedef不是简单替换 ,而是采用如同定义变量的方法那样来声明一种类型。也就是说;
//refer to (xzgyb(老达摩))
#define int_ptr int *
int_ptr a, b; //相当于int * a, b; 只是简单的宏替换
typedef int* int_ptr;
int_ptr a, b; //a, b 都为指向int的指针,typedef为int* 引入了一个新的助记符
这也说明了为什么下面观点成立
//QunKangLi(维护成本与程序员的创造力的平方成正比)
typedef int * pint ;
#define PINT int *
那么:
const pint p ;//p不可更改,但p指向的内容可更改
const PINT p ;//p可更改,但是p指向的内容不可更改。
pint是一种指针类型 const pint p 就是把指针给锁住了 p不可更改
而const PINT p 是const int * p 锁的是指针p所指的对象。
//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
测试代码如下:(测试环境vc6.0)
#include <stdio.h>
//此处,是使用宏定义定义了一个函数f,有两个参数x,y。则在“函数体”中x,y必须都要用括号括起来
#define f(x,y) (2*(x)-(y))
#define PINT int*
typedef int* pint; //注意要以分号结尾
int main()
{
int i;
i=f(2+1,1+1);
printf("%d\n",i);
int a=1,b=2,c=3,d=4;
PINT p1,p2; //此句相当于 int *p1,p2; 所以p2为int类型,而非int *类型
pint p3,p4;
p1=&a;
p2=b; //若为 p2=&b; 会报错
p3=&c;
p4=&d;
printf("%d,%d,%d,%d\n",*p1,p2,*p3,*p4);
int x=5,y=6;
//p5可更改,但是p5指向的内容不可更改,p6不可更改,但p6指向的内容可更改。
const PINT p5=NULL;
const pint p6=&y; //不初始化就会报错:"error C2734: 'p6' : const object must be initialized if not extern"
p5=&x;
*p6=8;
//*p5=8; //p5指向的内容不可更改,此处报错
//p6=&x; //此句亦因为p6为const类型指针变量,除了初始化之外,不能为const类型变量赋值(p6不可更改)
printf("%d,%d\n",*p5,*p6);
return 0;
}
运行结果: