#define跟typedef的区别

来源:互联网 发布:wind数据库账号密码 编辑:程序博客网 时间:2024/04/30 15:52

你能回答下面的问题吗?

这段代码

typedef  (int*)  pINT;

pINT  a,b;

和这段代码

#define  pINT2  int*

pINT2  a, b;

的区别是什么?

如鹏网上很多同学都犯了类似的错误,详见这个帖子:

http://www.rupeng.com/forum/thread-244-1-1.html

这道题把C语言中指针以及"typedef "和"#define"的区别这两个知识点融到了一起。下面分析一下:

 

1、指针的定义

在c语言中可以如下定义两个整形变量:

int a;

int b;

也可以如下的简写的方式定义两个整形变量:

int a, b;

同理也可以如下的方式定义两个字符型变量:

char a, b;

同样可以如下定义两个整形指针变量:

int* a;

int* b;

也就有人错误的认为也可以如下简写的方式定义两个整形指针变量:

int* a, b;

需要注意:基类型*号标识符在以逗号分隔的标识符列表中每个将被用作指针的标识符前都必须加上解引用操作符*号。所以要用简写的方式定义两个整形指针变量,要用int *a, *b;

而int* a, b;等价于

int* a;

int b;

而int *a, *b;才等价于

int *a;

int *b;

为了防止发生类似错误,这里建议定义指针变量的时候把"*"和变量名写在一起。

 

2、宏展开

C语言中的宏就是一个简单的字符串替换,比如下面的语句:

#define  MY1  3+2

int i = MY1 * 6;

最后i的值等于3+2*6,而不是(3+2)*6。因为编译器只会将MY1简单的替换为3+2,并不会是大家想像的那样加上括号。

上面这个道理很多同学都明白,那么下面这个语句也就不难理解了:

#define  pINT2  int*

pINT2  a, b;

编译器只会把宏pINT2简单的替换成int*,所以替换后的代码是:

int* a, b;

由上面的分析我们得知这句代码的意思是:声明整形指针变量a和整形变量b。

 

3、typedef类型别名定义

C语言中可以使用typedef为类型指定别名,比如:

typedef  int  myint;

就是为int指定一个别名myint,以后所有用int定义变量的地方都可以使用myint。

同样可以为指针类型指定别名,比如:

typedef  int*  pMyInt;

那么以后就可以如下定义整形变量指针:

pMyInt  a;

pMyInt  b;

那么下面这句是什么意思呢?

pMyInt  a, b;

这句话的意思就是定义两个整形变量指针a和b,因为pMyInt是一种类型(int *)的别名,也就是说pMyInt是一种类型。等价于:

int* a;

int* b;

 

总结:用宏和typedef虽然都可以达到定义类型别名的效果,但是由于宏定义的方式很容易出错,既然C语言有专门的定义类型别名的关键字typedef,所以定义别名最好使用typedef。

 

文章出处:http://www.rupeng.com/forum/thread-279-1-1-uid263.html

 

 

原创粉丝点击