#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
- #define跟typedef的区别
- #define跟typedef的区别
- typedef & #define 的区别
- typedef & #define 的区别,
- typedef和define的区别
- typedef与#define的区别
- typedef 和 define的区别
- define和typedef的区别
- #define和typedef的区别
- Typedef和define的区别
- #define和typedef的区别
- Typedef和define的区别
- #typedef与#define的区别
- #define和typedef的区别
- Typedef和#define的区别
- typedef 和 define的区别
- typedef和#define的区别
- define和typedef的区别
- pku1422
- DSP BootLoader 应用笔记(转珠海阿良的blog)
- 云联云
- js使页面出现空白页
- (二十五)下一站在哪里 - 3
- #define跟typedef的区别
- linux学习
- 电大的学习
- 关于c,c++输出格式控制
- 六种异常处理的陋习
- Convert.ToInt32()与int.Parse()的区别
- DELPHI的Tstring抽象类研究
- 常用DSP网站
- (二十五)下一站在哪里 - 4