| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1827 人关注过本帖
标题:指针作减法运算问题
只看楼主 加入收藏
C基础
Rank: 6Rank: 6
等 级:侠之大者
威 望:6
帖 子:133
专家分:421
注 册:2018-10-15
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:7 
指针作减法运算问题
#include <stdio.h>
int main()
{
    int a[3]={1,2,3};
    int *p,*q,t;
    p=&a[110];//显然超出了数组范围
    q=&a[-9];//在数组中下标是不能为负的
    t=p-q;
    printf("%d",t);
return 0;
}
//这个程序的运行结果是119
//我的问题是问什么数组下标超出了数组范围甚至为负数这个程序还是可以运行的,我想听听大家是怎么理解的,和我的是不是相同,我用的编译软件是DEVC


[此贴子已经被作者于2018-11-14 20:13编辑过]

搜索更多相关主题的帖子: 指针 减法 运算 int 数组 
2018-11-14 20:04
幻紫灵心
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山咔咔里面
等 级:贵宾
威 望:53
帖 子:396
专家分:2640
注 册:2018-3-30
收藏
得分:3 
数组[]里面的数字就是一个对于a[0]的地址的偏移量而已。你这只是取得了地址,访问非法地址会出错的。

saber,别哭.
2018-11-14 20:17
gold615
Rank: 2
等 级:论坛游民
帖 子:54
专家分:75
注 册:2014-6-7
收藏
得分:3 
这是c语言自身的设计,要是在java或者python里边,直接就索引越界报错了,但是c没有这些复杂的特征;在c语言的数组中,没有保存数组情况的信息,都由开发人员自己掌握,超过数组的内存区域可以访问,只是这种访问是错的,它可以读取到数据,但是应该不能写入。
2018-11-14 20:25
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:3 
换一种写法可能好理解些
#include <stdio.h>
int main()
{
    int a[3]={1,2,3};
    int *p,*q,t;
    //p=&a[110];
    p = &a[0];
    p = p + 110;
    //q=&a[-9];
    q = &a[0];
    q = q - 9;
    t = p - q;
    printf("%d",t);
    return 0;
}
2018-11-14 20:29
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
再这样看看,相对偏移。
#include <stdio.h>
int main()
{
    int a[3]={1,2,3};
    int *p,*q;
    p = &a[1];
    q = &p[1];
    printf("%d\n",*q);
    q = &p[-1];
    printf("%d\n",*q);
    return 0;
}
2018-11-14 20:33
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:3 
& 和 []
互为逆运算
p=&a[110]
就是
p = a + 110
你的代码其实就是

p = a + 110
q = a - 9
t = p - q
 = (a + 110) - (a - 9)
 = a + 110 - a + 9
 = a - a + 110 + 9
 = 119

没毛病





https://zh.
2018-11-14 20:46
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
以下是引用gold615在2018-11-14 20:25:58的发言:

这是c语言自身的设计,要是在java或者python里边,直接就索引越界报错了,但是c没有这些复杂的特征;在c语言的数组中,没有保存数组情况的信息,都由开发人员自己掌握,超过数组的内存区域可以访问,只是这种访问是错的,它可以读取到数据,但是应该不能写入。

既没读 也没写 你看错了

https://zh.
2018-11-14 20:47
C基础
Rank: 6Rank: 6
等 级:侠之大者
威 望:6
帖 子:133
专家分:421
注 册:2018-10-15
收藏
得分:0 
谢谢以上给我回复的各位,谢谢哈,我的理解是虽然p,q指向的变量是不可预料的,但是地址是真实存在的,所以虽然不可以引用,但是只进行地址运算是可以的,不知道这样理解可不可以?
2018-11-14 21:55
快速回复:指针作减法运算问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018092 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved