关于C Primer Plus(第5版)的一个疑问?望高手指点!

hawkhein 2010-12-24 08:37:20
中文版 p270页中下倒数第13行到第8行。是用来证明倒数第18行的。
下面是复制的英文原版:
int * p1;

const int * p2;

const int ** pp2;

p1 = p2; // not valid -- assigning const to non-const

p2 = p1; // valid -- assigning non-const to const

pp2 = &p1; // not valid -- assigning non-const to const 相当于我说的倒数第18行。
书中说两层间接运算,这样赋值不安全。理由是下面的例子。
(相当于中文版倒数第13行到第8行)
const int **pp2;

int *p1;

const int n = 13;

pp2 = &p1; // not allowed, but suppose it were

*pp2 = &n; // valid, both const, but sets p1 to point at n

*p1 = 10; // valid, but changes const n
他这里说n的值被改变了。其实,他这里举例不对啊.最后一步赋值,在这本书从里前面p263页里说了,一个没有初始化的p1是不可以赋值的。所以这个例子不能作为说明前面的理由。那么前面说两层间接运算,这样赋值不安全。这句话还要商榷了。。。

到底安不安全?有没有更合适的例子?

...全文
66 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hawkhein 2010-12-24
  • 打赏
  • 举报
回复
可以证明不安全。谢谢!
实际上这里应该说:不可以连续用一个常量和一个非常量对一个常量赋值。(即使在不同指针层面)。所以在两层间接运算,赋值不安全。




c primer plus 5 有中文版? 多少大洋?
答:60元。09印刷的版本,很不错。到目前我看的为止,没发现语法、逻辑、标点....错误。只有一页把d打成c。而且不在程序中。一眼可以看出来。
yuppy 2010-12-24
  • 打赏
  • 举报
回复

int *p = malloc(sizeof(int));
const int n = 13;
const int **pp;
*p = 2;
printf("%d\n", *p);
printf("%d\n", n);
pp = &p;
*pp = &n;
*p = 3;
printf("%d\n", n);


我也才学不久,不知道说的对不,你调试下..

另外问下: c primer plus 5 有中文版? 多少大洋?
漫步者、 2010-12-24
  • 打赏
  • 举报
回复
先初始化一下吧!
yuppy 2010-12-24
  • 打赏
  • 举报
回复
搂主 你可以初始化以下P1然后再 *P1 = 10, 最后n的值还是会被改变的,同样还是说明了 两层间接运算,赋值不安全..

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧