V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
deepkolos
V2EX  ›  程序员

指针应该叫做标识符变量

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

    花了 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  
       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   ·   实用小工具   ·   2014 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:02 · PVG 09:02 · LAX 17:02 · JFK 20:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.