注册 登录
查看: 703|回复: 20

typedef和define的区别(笔试题)

[复制链接]
发表于 2014-12-15 15:43:15 | 显示全部楼层 |阅读模式
本帖最后由 gsc617 于 2014-12-15 15:44 编辑

研究生学长面试回来告诉我们有这么一题,考考大家。先给大家普及一个知识点:const int* p;  //p不可更改,但p指向的内容可更改
那么问题来了,下面这句呢???

试题:
  1. typedef int * pint ;
  2. #define PINT int *

那么以下的区别:
  1. const pint p ;//
  2. const PINT p ;//

成才的速度赶不上年龄的增长速度也是一种失败,所以要天天努力天天进步有没有感到很简单,大家好好想想呀,别一下子就查资料,答案过几天附上


回复

使用道具 举报

发表于 2014-12-15 15:44:32 | 显示全部楼层
这个比较简单,差别就在于定义多个变量的时候。

PINT  a,b;

a 是指针,而b是 int 型变量
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-15 15:45:31 | 显示全部楼层
仰逸致 发表于 2014-12-15 15:44
这个比较简单,差别就在于定义多个变量的时候。

PINT  a,b;

你这么大神了,你不算
回复 支持 反对

使用道具 举报

发表于 2014-12-15 18:34:20 | 显示全部楼层
这个好像每日一题有吧,忘了,之前看过。
回复 支持 反对

使用道具 举报

发表于 2014-12-15 18:35:18 | 显示全部楼层
以前搜过这两个差别,如果是一个变量的话,宏替换过来是一样的;
这个太简单了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-15 18:39:51 | 显示全部楼层
Ray______ 发表于 2014-12-15 18:35
以前搜过这两个差别,如果是一个变量的话,宏替换过来是一样的;
这个太简单了

那你写出答案呀→_→
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-15 18:50:28 | 显示全部楼层
法平心 发表于 2014-12-15 18:34
这个好像每日一题有吧,忘了,之前看过。

把答案写出来,而且能写对了我就信
回复 支持 反对

使用道具 举报

发表于 2014-12-15 19:27:58 | 显示全部楼层
gsc617 发表于 2014-12-15 15:45
你这么大神了,你不算



= = =~
          pint a,b;    为int *a;int *b;
          PINT a,b;    为int *a;int  b;





回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-15 19:59:49 | 显示全部楼层
Ray______ 发表于 2014-12-15 19:27
= = =~
          pint a,b;    为int *a;int *b;
          PINT a,b;    为int *a;int  b;

  • const pint p ;//
  • const PINT p ;//
  • 我是考这题,他们的区别,你这是什么情况


回复 支持 反对

使用道具 举报

发表于 2014-12-15 23:06:30 | 显示全部楼层
个人意见,,,

对于前者,pint是一个类型,const 仅仅修饰 p,即p这个指针的指向恒定(p的类型是int *const,必须在定义时初始化指向),所以const放在哪都一样,即下面两行完全等价:
  1. const pint p ;
  2. pint const p ;

实验证明(可以看到,无论是第一个定义的变量还是第二个定义的变量,无论是const在前还是在后,定义的变量类型均为int *const):


对于后者,,,直接看证明吧,,,,,



总结,typedef、#define、const、int、*、volatile等,在C语言里使用及其灵活,稍不注意程序的运行就偏离作者本意,使用时要及其谨慎!
正如人们说的,选择了C语言,一方面享受灵活性的时候,另一方面要自己承担责任,别把代码的歧义推给编译器!
还有,建议在实际使用时,如果不是有特殊需要(保密?防偷窥?),最好不要使用这样“不太常用”的代码,
当然,作为学习,深入研究一下也是极好的
(以上证明基于Visual C++ 6.0)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2014-12-15 23:18:51 | 显示全部楼层
再发一个cpp模式编译的结果



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2014-12-15 23:20:02 | 显示全部楼层
gsc617 发表于 2014-12-15 19:59const pint p ;//
const PINT p ;//

const (pint ) p
const PINT (p)

回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-15 23:25:09 | 显示全部楼层
Ray______ 发表于 2014-12-15 23:20
const (pint ) p
const PINT (p)

不对,,,区别-.-
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-12-15 23:34:54 | 显示全部楼层
执着~~~
再发一个MDK5.12编译的结果(已开启C99 Mode)




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2014-12-16 00:06:27 | 显示全部楼层
gsc617 发表于 2014-12-15 23:25
不对,,,区别-.-

const (int *) p  内容只读
const int (*p)   指针地址只读


= =再不行就不知道了~~~最近都在看小甲鱼
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-16 08:51:13 | 显示全部楼层
Ray______ 发表于 2014-12-16 00:06
const (int *) p  内容只读
const int (*p)   指针地址只读

这才对嘛,,,早该这样子回答了。。。楼上那哥们才是大神中的无人机
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-16 08:52:03 | 显示全部楼层
xkwy 发表于 2014-12-15 23:34
执着~~~
再发一个MDK5.12编译的结果(已开启C99 Mode)

我超级佩服你呀,,,厉害
回复 支持 反对

使用道具 举报

发表于 2014-12-16 15:05:46 | 显示全部楼层
gsc617 发表于 2014-12-16 08:51
这才对嘛,,,早该这样子回答了。。。楼上那哥们才是大神中的无人机

也是最近看教程看多了才会分析,自己还没这样子写过呢~~
回复 支持 反对

使用道具 举报

发表于 2014-12-16 16:48:52 | 显示全部楼层


看老有人针对这一块拿来说事儿,才忍不住仔细辨析一下,
不过我平时写程序都是用typedef,不会出错。
回复 支持 反对

使用道具 举报

发表于 2015-3-17 12:00:57 | 显示全部楼层
哈哈哈哈
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2015-10-2 13:13:22 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回列表 返回顶部