为什么感觉 C 的常量以及指针相关的语法十分令人费解?

2016-01-13 12:45:17 +08:00
 b244183
常量 常量指针 指向常量的指针 常量 常量指针 指向常量的常量指针

指针++=++指针 指针++=指针++ ++指针=++指针 *(++指针) *(指针++)

最近在看 Pointers on C
感觉这些东西是有规则,但是十分 counterintuitive ,令人费解
2491 次点击
所在节点    C
40 条回复
raysonx
2016-01-13 17:09:12 +08:00
一言以蔽之:指針保存的只是一個整數,和 long 、 int 沒有本質區別,其他皆為語法糖。
ffffwh
2016-01-13 17:27:20 +08:00
“右左法则”

你还没有见识过 C++的引用、右值引用、指针 /引用与 template 连用等等
dorentus
2016-01-13 17:31:56 +08:00
我完全不同意 raysonx 的看法

指针和整数是完全不同概念的东西,只是在 C 里面它刚好用一个特定长度的整数值表示而已(原因和硬件或者汇编的细节以及影响了 C 的设计的那些语言的细节有关)。

指针的那些加加减减的操作符才是语法糖。正是这些操作符产生了它在逻辑上就是一个整数的假象。但是要明白,指针并不是整数,对它的这些加加减减代表的意义和遵循的规则并不完全和整数的那些一样。
raysonx
2016-01-13 17:51:02 +08:00
@dorentus 你是在語言的層面上看的。對於 CPU 來講什麼數據類型沒有任何意義,他只會根據你調用指令的不同執行不同的操作。編寫匯編程序的時候,讀內存都是需要傳地址作為操作數的。

所謂加加減減所代表的意義只是編譯器層面的東西,編譯器會自動把加減法轉為被指向數據類型大小的倍數。這個倍數的値是硬編碼在目標代碼中的。
iyangyuan
2016-01-13 17:52:10 +08:00
因为是给聪明人看的,像我这种愚钝的人只能搞面向对象
vanxining
2016-01-13 18:21:37 +08:00
@congeec 第二种是什么意思呢?没看明白。
vanxining
2016-01-13 18:25:36 +08:00
哦,查了一下,原来是指向一个固定长度数组的指针。第一次看到。新技能 get√。
Reficul
2016-01-13 18:32:10 +08:00
指针就是内存地址, C 语言的指针还是很容易理解的,只是容易在 debug 的时候抓狂
b244183
2016-01-13 19:14:28 +08:00
看了 K&R 的 5.12 Complicated Declarations
基本搞懂了
woai110120130
2016-01-14 07:29:26 +08:00
我很费解 楼主为什么很费解
louk78
2016-01-14 08:30:07 +08:00
因为是给聪明人看的,像我这种愚钝的人只能搞面向对象
msg7086
2016-01-14 09:02:54 +08:00
如果你觉得设计得不好,你应该 1972 年的时候就提出来。

如果没有,那么说明你那时候 —— 要么还没这水平去提意见,要么你还没出生。

或者两者皆是。
saeba1030
2016-01-14 10:41:39 +08:00
对于指针来说,数据类型只是告诉指针应该以什么方式去存取内存里的数据,指针本身无所谓类型。
cheng4741
2016-01-14 11:10:33 +08:00
@msg7086 不同意你的观点,如果一个东西设计得不好,不一定能在当时就体现出来。很多东西都是随着时间的推移才发现原来设计的有问题。
msg7086
2016-01-14 11:24:23 +08:00
@cheng4741 发现有问题就不能随便改了。

你去看看 Python 3 。
ma125125t
2016-01-14 11:36:05 +08:00
@cheng4741 显然,设计的是有问题,不然哪有 OOP 什么事呢?
chiuup
2016-01-14 14:47:49 +08:00
@saeba1030 准确地说,指针的数据类型是告诉编译器应该怎么样翻译成汇编码,指针本身是有类型的,并且这个类型在编译时很重要。
chiuup
2016-01-14 14:56:47 +08:00
追溯到源头的话, C 是一帮对汇编代码十分精通的大牛设计的, C 是对汇编码最直接的一层抽象。如果你可以站在汇编程序员的角度来看 C 的这些设计的话,很多 C 的设计就很好理解了。比如说你提到指针算术,其实是对 lea 的一种特定用法的抽象。
ahbcd112
2016-01-14 15:08:58 +08:00
很久很久以前。。。内存是非常非常贵的
怎样节省怎么用。内存各种算
内存的增长是指数增加的(比尔不是说过,个人电脑只要 32M 就够了!!某 N 年前电影,里面有一段,机器人能存储他看到的所有东西,因为他有一个非常非常大的硬盘。。。。 500MB )
然而,开发费用。。。貌似没降多少吧。
所以 OOP 各种发展,浪费点空间。减少开发、维护工作量。
lilydjwg
2016-01-14 15:17:26 +08:00
@b244183 我曾经看到过有人讲 C 语言的指针和常量语法为什么会是现在这个样子。然而我早已不记得了……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/250407

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX