免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3463 | 回复: 12

C语言指针问题,你想过没? [复制链接]

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:57:09C
日期:2016-10-25 16:17:59
发表于 2010-12-20 20:24 |显示全部楼层
有如下定义:

char s[][10] = {"123456789","123456789","123456789","123456789","123456789"};

char(*p)[10] =  s;

假设 二维数组的首地址为0x1,那么有

p == 0x1;
p+1 == 0xb;

s[0] == 0x1;
s[1] == 0xb;
请问计算机是如何来计算表达式(p+1)-p的?
按照常理,应该先计算括号内的p+1,值为(0xb),故 (p+1)-p应该为0xb - 0x1.
但实际上结果却是1。
有人知道表达式(p+1)-p是怎么计算的?
请不要回复诸如“p+1指向下一个一维数组”之类的答案,这种答案学过C的都会YY。

今天看华为产品的内核代码,看到一个指针所想到的。

以下是我今天的猜测,不知道是不是这样的:
计算机在做算术运算前会将表达式各项类型进行探测,然后完成类似强制类型转一样的工作,最后再进行算术运算。

请高人来YY

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:57:09C
日期:2016-10-25 16:17:59
发表于 2010-12-20 20:26 |显示全部楼层
{:3_180:}附上几个结果:

(p+1)-p ==1;
s[1] -s[0] ==10;

论坛徽章:
0
发表于 2010-12-20 22:12 |显示全部楼层
p+1 计算机应该算出来是加9的

论坛徽章:
0
发表于 2010-12-20 22:41 |显示全部楼层
没搞清楚热心过头真是丢人丢大发了,汇编代码直接就得出1和10了,编译器内部计算了。
当我没说!

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:57:09C
日期:2016-10-25 16:17:59
发表于 2010-12-20 22:51 |显示全部楼层
回复 4# dzmcs


    编译器内部计算???怎么算的?{:3_180:}

论坛徽章:
0
发表于 2010-12-20 23:15 |显示全部楼层
瞎猜的,编译器能识别类似(x+n)-x或者类似(x+n)-n这样的表达式吧。

论坛徽章:
0
发表于 2010-12-21 00:38 |显示全部楼层
回复 1# shaohui973


    这是由编译器来计算的。指针变量的运算是以它的对象类型作为单位的。 这也是为什么声明的时候需要显式的告知数据除第一维外其它维的长度的原因。

论坛徽章:
0
发表于 2010-12-21 09:04 |显示全部楼层
首地址+or-偏移吧

(p+1)-p


a = p + 1*sizeof(p的类型)
b = ar - p
c = b

论坛徽章:
0
发表于 2010-12-21 10:29 |显示全部楼层
有是这么老套的问题... 如果会汇编的话...C语言的指针没什么好神秘的...

论坛徽章:
0
发表于 2010-12-21 11:27 |显示全部楼层
指针的运算是和指针所指向的数据类型相关的
是指针的绝对偏移量除上对应数据类型的长度得到的结果
而不是简单地将内存地址作差
这在《C和指针》一书中有详细介绍
所以在定义指针和数组的时候一定要让编译器明确数据结构的长度
如果长度不确定的话,肯定不会通过编译
这是因为无数据长度在编译过程当中定义的
同样,指针的运算一定离不开指针所指向的数据长度
绝对不是单纯的指针在计算内存绝对距离
清楚这一点,上面的结果就显而易见了
如果还有疑问,就仔细看一下《C和指针》吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP