V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ant_sz
V2EX  ›  问与答

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

  •  
  •   ant_sz · 2012-08-25 01:20:10 +08:00 · 4694 次点击
    这是一个创建于 4472 天前的主题,其中的信息可能已经有所发展或是发生改变。
    感觉*应该是和类型在一起的啊,比如我们可以先:
    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   ·   实用小工具   ·   2733 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 13:30 · PVG 21:30 · LAX 05:30 · JFK 08:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.