花了 4 天时间写的第一篇逻辑博文,欢迎各路大神前来纠错~~
大二底层知识不多,所以哪有有用词不当的,请见谅~~ http://deepkolos.cn/#articles/{ADF360A2-BDDF-8A32-B617-ECF090BA56F1}.html
1
xxxyyy 2016-10-04 14:59:47 +08:00 via Android
为什么不看英文的定义呢?
|
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 怎么修饰的,根本用不着你猜测。 总之,是学艺未精而想得太多。 |
3
bsidb 2016-10-04 15:55:04 +08:00 via Android
同意楼上,多思考是好,不过还是好好把基础打实。
|
4
Andiry 2016-10-04 15:56:26 +08:00
指针就是地址,有那么难吗?
|
5
Shura 2016-10-04 16:37:48 +08:00 via Android
就是内存地址啊
|
6
GentleSadness 2016-10-04 16:44:57 +08:00 via Android
底层学是好,但才看几句就学人家写博文,还想自己定义指针该叫什么就是坑
|
7
lance6816 2016-10-04 16:48:22 +08:00
什么叫民科
|
8
deepkolos OP 补充:经过师兄的指点,需要给地址绑定类型信息就可以了*(int*)(0x0018ff44)就可以按照 int 类型的方法操作改地址对应的内存块了
|
10
q397064399 2016-10-04 17:52:14 +08:00 1
入乡随俗,国内一般分为
引用变量 指针变量 拷贝传递变量 (值拷贝 分为对象拷贝 和 基本类型拷贝) 对象拷贝分为 浅拷贝 和 深拷贝 Java 貌似只有引用传递,很多对象 只支持浅拷贝 C++全都支持 Python 只有引用 C 支持 值传递 还有 指针变量 |
11
lechain 2016-10-04 18:01:14 +08:00
指针就是指针,哪来的这啥那啥的。就是指针咯,汉语词汇“指针”有那么难理解吗?
|
12
ZEOH 2016-10-04 18:52:59 +08:00
另外中文句子中请用全角标点。
|
14
kmyzzy 2016-10-04 19:23:08 +08:00 via Android
思而不学则殆
|
16
zhangbohun 2016-10-04 19:27:51 +08:00 via Android
没关系的,积累经验教训,学习和思考都很重要的。
|
17
deepkolos OP 对了关于 const 我还发现一点:
long long test2 = 3; const long const long const const const & const const ref = test2; 可以通过编译,正确运行~发现 const 可以放在很多地方,并且冗余也可以,这个不知道如何解释~~~求大神助攻 |
19
Balthild 2016-10-04 20:24:22 +08:00
学而不思则神棍,思而不学则民科
|
20
zmj1316 2016-10-04 20:46:33 +08:00
|
21
realpg 2016-10-04 21:52:19 +08:00
百度贴吧民科吧或许需要这种钻研编程的专家
|
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 吧。什么材料都是,一手的权威的资料才是最好的。 |
23
thekoc 2016-10-04 22:18:02 +08:00
@deepkolos 在自然科学领域实验是因为上帝不会告诉你他是怎么实现的…这个语言都是有人(上帝)把标准给你写好了为什么还要实验。。(加深印象的实验不算)
|
26
deepkolos OP 看到 VS 警告了,原来是 VS 自动忽略多余的 const
|
27
ipwx 2016-10-04 23:43:47 +08:00 1
虽然 @reus 拍砖非常狠,{“观察”、“推测”、“交叉验证”,不是学习 C/C++应有的方法,稍微靠谱的教材都会讲到 const 怎么修饰的,根本用不着你猜测。 },但是楼主你也别被打击了。{“观察”、“推测”、“交叉验证”}其实是非常非常重要的品质,只不过这个列表确实缺少了一个{“阅读”}。读得太少,所以思考的问题大多没有太多意义。所谓人类一思考,上帝就发笑嘛。
{只会读而不会思考的人是无法创造新事物的。}<-这句话我无法给出非常简单地说明,楼主也许只能意会一下。什么时候楼主能够思考每一个 C++ 关键字为什么要存在,设计 C++ 的人是怎么思考问题的,或许楼主就真的读懂了。 |
28
alqaz 2016-10-04 23:57:23 +08:00
@deepkolos const long const long const const const & const const ref = test2; 被这个吓到。
|
29
aheadlead 2016-10-05 00:25:46 +08:00 1
@deepkolos
“补充:经过师兄的指点,需要给地址绑定类型信息就可以了*(int*)(0x0018ff44)就可以按照 int 类型的方法操作改地址对应的内存块了” ------- 我以前也这么想过。不过自从学习了“虚拟存储器”,搞明白“虚拟地址空间”之后,就没这么想了。 其实我觉得学习的时候有这样的思考挺好的,上面有些朋友倒凉水倒得太狠了。不过还是推荐楼主一本好书:《 C 语言程序设计:现代方法(第 2 版)》 http://item.jd.com/10064146.html |
30
q397064399 2016-10-05 09:04:17 +08:00
@aheadlead 这样思考本身的路数就不对,所有程序语言的内存模型,只要你看完 CSAPP 第三章,程序语言的机器级表示,所谓的指针 引用 值拷贝 对象拷贝 深拷贝 浅拷贝 就迎刃而解了,要是自己探索 挺浪费时间的
|
31
breeswish 2016-10-05 10:41:44 +08:00
翻了第一屏感觉满屏错误,就不没继续看:
函数指针没有问题,存储了这个函数在内存中的位置; “ const 在修饰的时候在修饰对象的前后皆可以”:虽然都可以但是语义不同, const int * ptr 和 int * const ptr 不是等价的,具体参见 Clockwise/Spiral Rule |
32
deeporist 2016-10-05 11:28:12 +08:00
mov eax,esi
mov eax,[esi] |