关于C语言的指针,很多代码里都将 “*” 与变量名连在一起,比如 int *a ,这样做有什么典故么? 为什么不写作 int* a 也就是将“*”与类型连在一起? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ant_sz
V2EX    问与答

关于C语言的指针,很多代码里都将 “*” 与变量名连在一起,比如 int *a ,这样做有什么典故么? 为什么不写作 int* a 也就是将“*”与类型连在一起?

  •  
  •   ant_sz 2012-08-25 01:20:10 +08:00 5175 次点击
    这是一个创建于 4842 天前的主题,其中的信息可能已经有所发展或是发生改变。
    感觉*应该是和类型在一起的啊,比如我们可以先:
    typedef int* int_ptr;

    然后这么声明指针:
    int_ptr a;

    所以*应该是类型的一部分,int*是C当中与int相同地位的一种数据类型
    这样连起来貌似容易理解一些。

    其实我比较感兴趣的是,前一种做法有什么特殊原因么?有什么典故么?
    求不吝赐教~
    13 条回复    1970-01-01 08:00:00 +08:00
    leiz
        1
    leiz  
       2012-08-25 01:46:02 +08:00
    用的是*a,还是a?
    lldong
        2
    lldong  
       2012-08-25 01:52:53 +08:00   2
    一个好处可能是不会写出,`int* a, b;` 然后认为`b`也是一个指针;
    skydiver
        3
    skydiver  
       2012-08-25 02:51:44 +08:00
    楼上正解
    aaronmix
        4
    aaronmix  
       2012-08-25 02:56:09 +08:00
    据我所知只是个人习惯而已,有的人理解起来觉得int *a比int* a更容易。在绝大部分编译器看来都是一样的。
    21grams
        5
    21grams  
       2012-08-25 11:46:29 +08:00
    我一直都写int* a,对我来说这更好理解。
    像int *a,b; 这样的写法本身就应该避免。
    io
        6
    io  
       2012-08-25 13:24:11 +08:00
    可以这样解释,int表示引用一个函数/变量时返回的数据类型。如 int fun();int a;int *a; 不知道这样理解是否严谨
    xatest
        7
    xatest  
       2012-08-25 13:30:44 +08:00
    相反,我都写成int* a;
    因为左边表示类型(指针也是类型),右边表示变量的名字(指针不是名字的一部分)。
    同理引用也是int& a;
    我从来不在一行内声明多个变量。
    thinkinnight
        8
    thinkinnight  
       2012-08-25 15:14:08 +08:00
    主要是预防本来想定义两个指向int的指针a,b,也就是int *a, *b;但是在写的时候写成int* a, b;
    此时b就是int类型,而不是指针了。
    freestyler
        9
    freestyler  
       2012-08-25 16:27:27 +08:00
    没有为什么,就是style,个人喜好,

    K&R写的TCPL中用了这种, linux也是用这种
    http://www.kernel.org/doc/Documentation/CodingStyle
    goool
        10
    goool  
       2012-08-25 18:31:31 +08:00
    因为 C 语言中有一种尽可能让变量的「声明」与「使用」看起来差不多的奇怪传统。比如:

    int *p;
    ...
    *p = 5;

    int a[8];
    ...
    a[0] = 0;

    typedef int (*func)(int);
    func f;
    ...
    int ret = (*f)(3); // *可省略
    ant_sz
        11
    ant_sz  
    OP
       2012-08-25 19:28:21 +08:00   1
    @lldong
    @thinkinnight

    C语言这个特点比较纠结
    typedef int* int_ptr;
    之后,在进行
    int_ptr a,b;
    得到的a和b都是指针,但是
    int* a,b;
    b确实是int类型的,不明白为何这样设计。
    alsotang
        12
    alsotang  
       2012-08-25 23:32:44 +08:00
    @ant_sz 同问,我觉得如果int* a,b的话,就应该让a和b都是int*类型。
    RisingV
        13
    RisingV  
       2012-12-29 01:04:00 +08:00
    @ant_sz C诞生的比较早,可能那样做词法分析的时候比较方便吧,后面为了保持兼容就沿用了。现在Thompson 和 Pike 的作为“Better C”的 golang就不会这样
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3497 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 10:33 PVG 18:33 LAX 02:33 JFK 05:33
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86