免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: txdgtwpv
打印 上一主题 下一主题

[C++] [低水平帖]定义和声明时,星号(*)是靠着类型还是靠着变量 [复制链接]

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
1 [报告]
发表于 2011-08-26 08:12 |显示全部楼层
回复 1# txdgtwpv


    现在我喜欢用第一个。这是《C++ Templates》中建议用的风格。这种风格非常明确地说明了:类型 char* 和对象 var 是分离的。《C++ Primer》中也明确说明了,指针、引用、数组是复合类型。不过貌似《C++ Primer》中示例代码也是用第二种(忘记了)?

    第二个,纯粹的C程序员喜欢吧... 《The C Programming Language》里面用的是第二种。

    原来我喜欢第二种风格的说... 现在越发喜欢第一种而讨厌第二种。嗯,类型就是类型,变量就是变量,干嘛乱写?
    比如C++定义引用的用法:
    int a;
    int& b = a;
    我觉得很少有人喜欢这样写引用:
    int &b = a;

    char *a, b; // 拿这种说事的人估计会喜欢谭浩强老师书里的代码风格吧... 很少有人喜欢把指针和单纯的类型放在一起声明。一般来说声明都是分开的单行,如果不是单行,那同一行里面至少应该声明同样的类型吧。

    这个不说... 《C++ Templates》还建议这样的风格呢:
    int const var;
    int const* const p_var;
    因为...把const放在类型后面有益于维护typedef的语义...

    最后... 其实都是扯淡的... 不过现在我还是喜欢第一种(至于第3第4嘛...表示很纠结)... 这是为什么呢...

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
2 [报告]
发表于 2011-08-26 11:20 |显示全部楼层
回复 22# pmerofc


    非要在一行定义两个指针么。凡定义指针分行写行不。何况,指针的使用哲学不是“定义时即正确地初始化”吗?

    int*  a;  // 这是个野指针。

    严格地说,要么:
    int* p = NULL;
    要么:
    int* p = (int*)malloc(100 * sizeof(int));

    语义上,“*”是修饰类型的。指针是复合类型,就是说,你不可能定义一个类型无关的指针。引用、数组也是一样的。《C++ Primer》里面特别指出的。
    * p; // 啊,这样是定义一个类型无关的指针吗?

    定义指针的时候,你必须指明,这个指针是什么类型的指针(或者说指向什么类型):
    int* p;

    别说:
    void* p;
    是类型无关的。void* 表示指针是"void"类型。

    所以说:
    TYPE*  p; // 这种方式明确地,区分了,变量,和类型。它表示:变量p是TYPE*类型。对于类属/泛型编程来说,类型和变量的区分很重要。类型是类型,对象是对象。
    而
    TYPE   *p; // 这表示什么呢?表示变量*p是TYPE类型? no,它的语义仍然是:变量p是TYPE*类型。

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
3 [报告]
发表于 2011-08-26 12:06 |显示全部楼层
回复 26# pmerofc


    这种就没办法了... 哈哈。

    啊,要是按照类型修饰的说法,应该是这样写:

    int[3]* pary;   // 指向数组的指针。
    int*[] aryp;     // 指针数组

    可惜C没有这样的语法,呵呵

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
4 [报告]
发表于 2011-08-26 12:10 |显示全部楼层
回复 26# pmerofc


    比如C中声明数组非要这样写:
    int ary[];

    Java、C#之类的,都改成这种写法了(其目的也是在语法风格上强调类型和变量的分离):
    int[] ary;

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
5 [报告]
发表于 2011-10-06 05:14 |显示全部楼层
回复 76# littledick


    int* p[3]; 和int (*p)[3]; 是不同的,完全不是一回事。你C指针没学好。

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
6 [报告]
发表于 2011-10-06 05:18 |显示全部楼层
回复 75# KBTiller


    这是C在语法上的缺陷。 指针是数据类型,应该算到类型系统里去。

   如果是“正确”的语法,我觉得应该是这样的:

   int*[] p;          // int* p[];  p是一个指针数组
     int[3]* p;         // int (*p)[3]; p是一个指向数组的指针
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP