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

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

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

最近在看 Pointers on C
感觉这些东西是有规则,但是十分 counterintuitive ,令人费解
2490 次点击
所在节点    C
40 条回复
wizardoz
2016-01-13 13:18:10 +08:00
首先你要理解指针是一种类型(或多种类型),常量就是不能改变的变量。

对于 int 来说
int 是一种类型 int* 是一种类型,只不过这两种类型略微有一点关系而已。

const int 就是整型常量
const int* 就是指向整型常量的指针
int* const 是指向整型的指针常量
!! 注意其中的区别,一个是指针本身是常量,就是指针变量不能改,一个是指针不是常量可以改,但是指针指向的内存不能改。

当然还可以
const int * const
指向整型常量的指针长量。
指针的值也不能改,指针指向的地址的内容也不能改。
congeec
2016-01-13 13:27:47 +08:00
你打开的方式不对

来,告诉我什么是指针数组,什么是数组指针?
我不知道,但是一看我就知道下面两行代码是什么意思
int *p[2];
int (*p)[2];

同样地,指针++ = 指针++ 这是什么鬼?
while (*s++ = *t++); // 不过这行复制字符串的代码你肯定能理解

概念是抽象过的,一般比原来的东西难理解。写几行代码,抓住本质就行了
k9982874
2016-01-13 13:32:48 +08:00
理解不了我才表示费解,实在不行就去做前端啥的吧,没有指针。
7emes
2016-01-13 13:44:06 +08:00
@wizardoz 发现一个错别字,倒数第二行。
b244183
2016-01-13 13:47:04 +08:00
@wizardoz
@k9982874
@congeec 我知道这些是做什么用的,也会用,但是疑惑为什么语法要设计成这样,都没什么更直观的做法吗
f7ee9404
2016-01-13 13:51:43 +08:00
就是语法糖, c 设计的时候内存和硬盘单位价格非常高,对应现在的电脑没什么大用 代码怎么容易读怎么搞就行。

i++ 等价于 i=i+1
congeec
2016-01-13 13:57:02 +08:00
@b244183 为嘛要设计成这样?看 spec 吧: ISO/IEC 9899
多扯两句,据我所知 C 语言基本上是可移植的汇编,为汇编程序员设计的。
i++有直接对应的汇编指令 incr i
在汇编里操作数据只能用地址+偏移,自然而然 C 语言里就有指针这个概念了
kobe1941
2016-01-13 14:14:56 +08:00
指针和结构体在一起才坑爹%>_<%
maomaomao001
2016-01-13 14:25:44 +08:00
@wizardoz 好晕啊~~~为什么 C/C++是这种设计方式....
MCVector
2016-01-13 14:50:09 +08:00
@maomaomao001 to make your life easier.
young
2016-01-13 14:57:14 +08:00
<amp-youtube data-videoid="iIsZVqhaneo" layout="responsive" width="480" height="270"></amp-youtube>
想起了前几天看到的这个
wizardoz
2016-01-13 15:09:16 +08:00
@maomaomao001 其实从语义来讲很对称啊。整个过程只是变量,指针,和 const 三个概念组合以后发生了许多变化。并且组合以后并没有产生与三个概念矛盾的东西。
所以不应该说 C/C++设计成这样,应该说 C 语言的设计者没有进行很多的设计和封装,而是直接把事情的本质放出来了。
maomaomao001
2016-01-13 15:09:41 +08:00
@MCVector 骗子。。。
dorentus
2016-01-13 15:11:27 +08:00
推荐一本书:《征服C指针》
Kilerd
2016-01-13 15:30:08 +08:00
你的 C 功底不行啊,指针其实在 C 里面不算是特别难得吧。
yurivvvvv
2016-01-13 15:33:53 +08:00
我觉得正是 Pointers on C 把这些费解的东西讲的很清楚了。
b244183
2016-01-13 15:52:58 +08:00
@wizardoz
@Kilerd
@yurivvvvv 我想讨论的是语法层面的设计
jixiangqd
2016-01-13 16:09:41 +08:00
看 const 在*前还是*后,*前则是修饰*,*后则是修饰具体类型

const int *
int const *
int * const //只有这个修饰 int
chmlai
2016-01-13 16:18:33 +08:00
@b244183 那你有想出更好的设计吗?
k9982874
2016-01-13 17:04:21 +08:00
@b244183
你要知道 c/c++的内存操作原理就不会不懂了

c/c++数据传递默认传值,也就是直接做内存 copy ,操作一次就会产生一个内存 copy

如果是 int 之类的简单类型就算了,如果是 struct 或 class 之类的大对象那内存多少都不够用

所以为了解决这个问题引入了指针,指针的大小就是一个 unsiged int 的大小, copy 一个 int 的花销和 copy 一个对象的花销比还是很合算的

这样就避免了值传递时无穷无尽的内存 copy

还有什么修改对象值,前 const ,后 const 之类的东西都是额外的知识。

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

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

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

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

© 2021 V2EX