免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: sagasw
打印 上一主题 下一主题

[C] 《狂人C》一个不解处求教 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-12-22 19:43 |只看该作者
回复 9# OwnWaterloo


    链接?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
12 [报告]
发表于 2010-12-22 19:49 |只看该作者
回复 11# sagasw

http://bbs.chinaunix.net/thread-1628657-1-1.html

不过……   当纯理论研究就行了……

现实中的怪异指针格式越来越少。
像linux那样用unsigned long当指针的都可以获得很广泛的移植。
posix对指针的限制好像比C要低一些。

论坛徽章:
0
13 [报告]
发表于 2010-12-22 19:54 |只看该作者
回复 12# OwnWaterloo

不知这个帖子和我的问题有什么关系?

1,为何说"&i+1"恰好指向i后第一个int类型的数据,就有意义了呢?
2,&i+1与&i+2怎么就不一样了呢?

能否指教一下?

论坛徽章:
0
14 [报告]
发表于 2010-12-22 20:16 |只看该作者
回复 1# sagasw

这本书始终在强调要老老实实、认认真真地理解数据类型
(第二章我写了5、6遍)
多数书只强调数据的表示
这是极其片面的
数据类型还与运算密切相关

只有特定的数据类型才有特定的运算(double就没有%运算)
记得见过初学者问“指向函数的指针加1的结果”
这问题很幼稚,但责任不在学习者,我认为是教师没讲清楚或书没讲明白

此外,只有在一定条件下运算才有意义
比如当int为2B长时
32767+1就是一种未定义行为

对于指针也是如此
(就如前面网友讲的,没有乘法)
此外指针的运算也是有条件的
否则可能是一种未定义行为
指向Object的指针尽管可以与整数相加
但是有前提条件
就像数学函数有个定义域一样

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
15 [报告]
发表于 2010-12-22 20:16 |只看该作者
回复 13# sagasw

那个帖子主要说的是数组。

对数组: T A[N];
1. &A[i ] ( 0<=i && i<=N)  产生的都是合法的指针值。
2. &A[i ] i==N 指针值合法, 但不可解引用
3. &A[i ] ( 0<=i && i<N ) 合法, 且分别引用数组的所有元素
4. 在这些合法的指针 p 的基础上, 可以由 p + offset 得到新的指针值
若 p + offset 的结果在1的范围内, 是有良好定义的, 不会溢出。
若 p + offset 超出1的范围, 是未定义行为

例如:
int a[3];
*(&a[0]), *(&a[1]), *(&a[2]), (&a[3]) 都是合法的; &a[4]未定义
*(&a[0]+0), *(&a[0]+1), *(&a[0]+2), (&a[0]+3]) 也是合法的;  &a[0]-1,  &a[0]+4, 未定义
*(&a[1]-1), *(&a[1]+0), *(&a[1]+1), (&a[1]+2) 合法; &a[1]-2, &a[1]+3, 未定义
...


如果将 int i; 理解为一个维度为1的数组(这个需验证)  int a[1];
&i+1 即 &a[0]+1 是合法的
&i+2 即 &a[0]+2 是无定义的

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
16 [报告]
发表于 2010-12-22 20:27 |只看该作者
回复 14# KBTiller

也许,  事先给白纸一张的初学者说明哪些操作是合法的, 比事后给有一些经验的程序员说"你经常写的一些代码是非法的", 要容易被接受得多……

论坛徽章:
0
17 [报告]
发表于 2010-12-22 20:31 |只看该作者
我觉得两位都没解释清楚这个问题,而且KBTiller用极为特殊的例子来解释一个通用情况,不妥,而且理由也没有说服力。

而OwnWaterLoo又提出这个int i变数组的魔术,更为奇特。我个人觉得用数组来解释指针,跟用汇编解释C一样(小小反击一下,嘿嘿),都是片面的。

罢了,也不是什么关键问题,放一边了。

论坛徽章:
0
18 [报告]
发表于 2010-12-22 20:40 |只看该作者
回复  KBTiller

也许,  事先给白纸一张的初学者说明哪些操作是合法的, 比事后给有一些经验的程序员说 ...
OwnWaterloo 发表于 2010-12-22 20:27

是的
我认为一开始就应该灌输这种意识
以后就来不及了
既定的错误观念很难改变
就如同编程习惯一样

评分

参与人数 1可用积分 +1 收起 理由
OwnWaterloo + 1 喂,&amp;i+1, 求解释……

查看全部评分

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
19 [报告]
发表于 2010-12-22 20:41 |只看该作者
回复 17# sagasw

int 变数组是我根据那个帖里的内容和书中的内容猜的……
也许KBTiller不是这个意思……

其实以前就觉得 T x; 与 T a[1]; 在用法上很模糊, 两者很多时候可以交替使用。
只是没找到依据。

如果合法依据的话:
char c = 0;
assert( 0 == strlen(&c) );
也是合法的。


而且也恰好可以解释1楼的问题。

论坛徽章:
0
20 [报告]
发表于 2010-12-22 20:53 |只看该作者
我觉得两位都没解释清楚这个问题,而且KBTiller用极为特殊的例子来解释一个通用情况,不妥,而且理由也没有 ...
sagasw 发表于 2010-12-22 20:31


我有一种感觉
你不是ISO党
而是K&R_TCPL党
(自从你建议把“未定义行为也是一种错误代码”改成“也应该避免”我就有这种感觉)
ISO党从C语言的定义出发讨论问题
事实上C语言(标准)并没有定义
int i;
&i+2的意义
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP