指针应该叫做标识符变量 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
deepkolos
V2EX    程序员

指针应该叫做标识符变量

  •  
  •   deepkolos
    deepkolos 2016-10-04 14:18:28 +08:00 4220 次点击
    这是一个创建于 3344 天前的主题,其中的信息可能已经有所发展或是发生改变。

    花了 4 天时间写的第一篇逻辑博文,欢迎各路大神前来纠错~~

    大二底层知识不多,所以哪有有用词不当的,请见谅~~ http://deepkolos.cn/#articles/{ADF360A2-BDDF-8A32-B617-ECF090BA56F1}.html

    xxxyyy
        1
    xxxyyy  
       2016-10-04 14:59:47 +08:00 via Android
    为什么不看英文的定义呢?
    reus
        2
    reus  
       2016-10-04 15:46:02 +08:00   11
    这种基础的东西,就不用自己“推测”、“试验”什么的了,拿本好的教材,好好看看,好好理解,全盘接受就行。
    指针就是指针,这是个有明确定义的概念,也是个被广泛接受的表达这个概念的词汇。
    identifier 、 variable 也是有明确定义的概念,“指针应该叫做标识符变量”根本就是概念理解不透彻,才会得出的结论。

    “一个推论:在高级语言中,计算机内部的东西均以标识符做映射,表示,操作,指定(不允许在代码中直接指定地址操纵,比如*(0x00000001) = 3,原因是没有该地址的配置信息,而地址的配置信息储存在标识符当中)”

    就这一段话,就诸多错误:
    “计算机内部的东西”,这叫“内存”。
    “以标识符做映射”,错,表示内存存储位置的叫“变量”。标识符( identifier )是词法 /语法分析阶段的概念,一个标识符可能表示变量,可能表示类型,例如 int a; 这句, int 这个标识符表示整数类型, a 这个标识符表示一个变量。标识符还可能表示常量、模块等等,取决于不同语言的设计。但与内存映射的,都叫“变量”。
    “配置信息”,术语叫“类型信息”,这是关联到变量的,由编译器在类型分析 /推导阶段得出,它并不是“储存在标识符当中”,而是每个变量都有关联的类型信息。
    在 C 里, *((int*)(999)) = 33; 是可以通过编译的,执行时才会出错。所以直接读写某个地址是可以的,只要给出类型信息。这里是不需要定义变量的。所以整个“推论”是错的。

    “观察”、“推测”、“交叉验证”,不是学习 C/C++应有的方法,稍微靠谱的教材都会讲到 const 怎么修饰的,根本用不着你猜测。
    总之,是学艺未精而想得太多。
    bsidb
        3
    bsidb  
       2016-10-04 15:55:04 +08:00 via Android
    同意楼上,多思考是好,不过还是好好把基础打实。
    Andiry
        4
    Andiry  
       2016-10-04 15:56:26 +08:00
    指针就是地址,有那么难吗?
    Shura
        5
    Shura  
       2016-10-04 16:37:48 +08:00 via Android
    就是内存地址啊
    GentleSadness
        6
    GentleSadness  
       2016-10-04 16:44:57 +08:00 via Android
    底层学是好,但才看几句就学人家写博文,还想自己定义指针该叫什么就是坑
    lance6816
        7
    lance6816  
       2016-10-04 16:48:22 +08:00
    什么叫民科
    deepkolos
        8
    deepkolos  
    OP
       2016-10-04 17:42:56 +08:00
    补充:经过师兄的指点,需要给地址绑定类型信息就可以了*(int*)(0x0018ff44)就可以按照 int 类型的方法操作改地址对应的内存块了
    deepkolos
        9
    deepkolos  
    OP
       2016-10-04 17:47:17 +08:00
    @reus 的确是,承认,不过我从这猜测,我才发现了很多关于指针不常见的使用方式
    q397064399
        10
    q397064399  
       2016-10-04 17:52:14 +08:00   1
    入乡随俗,国内一般分为

    引用变量
    指针变量
    拷贝传递变量 (值拷贝 分为对象拷贝 和 基本类型拷贝)
    对象拷贝分为 浅拷贝 和 深拷贝

    Java 貌似只有引用传递,很多对象 只支持浅拷贝

    C++全都支持

    Python 只有引用

    C 支持 值传递 还有 指针变量
    lechain
        11
    lechain  
       2016-10-04 18:01:14 +08:00
    指针就是指针,哪来的这啥那啥的。就是指针咯,汉语词汇“指针”有那么难理解吗?
    ZEOH
        12
    ZEOH  
       2016-10-04 18:52:59 +08:00
    另外中文句子中请用全角标点。
    deepkolos
        13
    deepkolos  
    OP
       2016-10-04 19:05:44 +08:00
    @ZEOH 写代码方便,所以输入法设置了中文状态也使用英文标点了
    kmyzzy
        14
    kmyzzy  
       2016-10-04 19:23:08 +08:00 via Android
    思而不学则殆
    deepkolos
        15
    deepkolos  
    OP
       2016-10-04 19:25:24 +08:00
    @kmyzzy 对,谢谢提醒~~
    zhangbohun
        16
    zhangbohun  
       2016-10-04 19:27:51 +08:00 via Android
    没关系的,积累经验教训,学习和思考都很重要的。
    deepkolos
        17
    deepkolos  
    OP
       2016-10-04 19:36:59 +08:00
    对了关于 const 我还发现一点:
    long long test2 = 3;
    const long const long const const const & const const ref = test2;
    可以通过编译,正确运行~发现 const 可以放在很多地方,并且冗余也可以,这个不知道如何解释~~~求大神助攻
    deepkolos
        18
    deepkolos  
    OP
       2016-10-04 19:38:37 +08:00
    Balthild
        19
    Balthild  
       2016-10-04 20:24:22 +08:00
    学而不思则神棍,思而不学则民科
    zmj1316
        20
    zmj1316  
       2016-10-04 20:46:33 +08:00
    @deepkolos 下次放这种**代码还宣称编译通过的记得带上你的编译选项,顺便多挑几个编译器试试

    说真的,没想到这种本来就是人为创造出来的领域还能出民科,长见识了
    realpg
        21
    realpg  
    PRO
       2016-10-04 21:52:19 +08:00
    百度贴吧民科吧或许需要这种钻研编程的专家
    reus
        22
    reus  
       2016-10-04 21:55:51 +08:00   1
    @deepkolos g++ 6.2.1 和 clang++ 3.8.1 都编译不过。
    还是那句话,好好看书,看《 The C++ Programming Language 4th 》之类的,看语言标准是怎样定义的,不要试验,不要以为某个编译器能编译,就当作真理来看待。
    因为编译器也会有不遵循标准的地方,编译器也会在该报错时没报。
    “指针不常见的使用方式”,我很怀疑你发现的很多都是“未定义行为”,只不过在某个编译器的某个版本恰好符合你的期望,但如果你不真正掌握,只是靠试验和猜测,很有可能踩坑或者埋坑的。

    推荐学下 rust ,至少比 C++少很多未定义行为,也有足够的空间让你钻研思考,编译器也只有一个实现,不至于像 C++一样各个实现不一样。

    还有不要用百度了,翻墙用 google 吧。什么材料都是,一手的权威的资料才是最好的。
    thekoc
        23
    thekoc  
       2016-10-04 22:18:02 +08:00
    @deepkolos 在自然科学领域实验是因为上帝不会告诉你他是怎么实现的…这个语言都是有人(上帝)把标准给你写好了为什么还要实验。。(加深印象的实验不算)
    deepkolos
        24
    deepkolos  
    OP
       2016-10-04 22:24:29 +08:00
    @zmj1316 使用 VS2015 编译的,不知道还有其他编译器的区别,看看我果然是民科啊~~
    deepkolos
        25
    deepkolos  
    OP
       2016-10-04 22:27:37 +08:00
    @reus 我是用 VS2015 编译的,嗯嗯,还是我要学多点东西才行
    deepkolos
        26
    deepkolos  
    OP
       2016-10-04 22:39:05 +08:00
    看到 VS 警告了,原来是 VS 自动忽略多余的 const
    ipwx
        27
    ipwx  
       2016-10-04 23:43:47 +08:00   1
    虽然 @reus 拍砖非常狠,{“观察”、“推测”、“交叉验证”,不是学习 C/C++应有的方法,稍微靠谱的教材都会讲到 const 怎么修饰的,根本用不着你猜测。 },但是楼主你也别被打击了。{“观察”、“推测”、“交叉验证”}其实是非常非常重要的品质,只不过这个列表确实缺少了一个{“阅读”}。读得太少,所以思考的问题大多没有太多意义。所谓人类一思考,上帝就发笑嘛。

    {只会读而不会思考的人是无法创造新事物的。}<-这句话我无法给出非常简单地说明,楼主也许只能意会一下。什么时候楼主能够思考每一个 C++ 关键字为什么要存在,设计 C++ 的人是怎么思考问题的,或许楼主就真的读懂了。
    alqaz
        28
    alqaz  
       2016-10-04 23:57:23 +08:00
    @deepkolos const long const long const const const & const const ref = test2; 被这个吓到。
    aheadlead
        29
    aheadlead  
       2016-10-05 00:25:46 +08:00   1
    @deepkolos
    “补充:经过师兄的指点,需要给地址绑定类型信息就可以了*(int*)(0x0018ff44)就可以按照 int 类型的方法操作改地址对应的内存块了”
    -------
    我以前也这么想过。不过自从学习了“虚拟存储器”,搞明白“虚拟地址空间”之后,就没这么想了。

    其实我觉得学习的时候有这样的思考挺好的,上面有些朋友倒凉水倒得太狠了。不过还是推荐楼主一本好书:《 C 语言程序设计:现代方法(第 2 版)》 http://item.jd.com/10064146.html
    q397064399
        30
    q397064399  
       2016-10-05 09:04:17 +08:00
    @aheadlead 这样思考本身的路数就不对,所有程序语言的内存模型,只要你看完 CSAPP 第三章,程序语言的机器级表示,所谓的指针 引用 值拷贝 对象拷贝 深拷贝 浅拷贝 就迎刃而解了,要是自己探索 挺浪费时间的
    breeswish
        31
    breeswish  
       2016-10-05 10:41:44 +08:00
    翻了第一屏感觉满屏错误,就不没继续看:
    函数指针没有问题,存储了这个函数在内存中的位置;
    “ const 在修饰的时候在修饰对象的前后皆可以”:虽然都可以但是语义不同, const int * ptr 和 int * const ptr 不是等价的,具体参见 Clockwise/Spiral Rule
    deeporist
        32
    deeporist  
       2016-10-05 11:28:12 +08:00
    mov eax,esi
    mov eax,[esi]
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5239 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 05:47 PVG 13:47 LAX 21:47 JFK 00:47
    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