| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2303 人关注过本帖
标题:关于指针求差问题
只看楼主 加入收藏
davidguhao
Rank: 1
来 自:广东
等 级:新手上路
帖 子:126
专家分:7
注 册:2016-7-18
结帖率:89.47%
收藏
 问题点数:0 回复次数:9 
关于指针求差问题
#include <stdio.h>

int array1[3] = { 6, 8, 9 };
float array2[2] = { 2, 3 };
int *ptr_1 = &array1[2];

float difference;

float *ptr_2 = &array2[1];

int main(void)
{
difference = ptr_1 - ptr_2;
printf("%d", difference);
return 0;
}
以上是我写的代码, 我想知道为什么不能这样相减
编译器给出的错误提示是
invalid operands to binary -
搜索更多相关主题的帖子: difference include invalid return 编译器 
2016-08-06 15:03
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
difference = ptr_1 - ptr_2;   不同类型要用强制转换
printf里的%d,可能也要改改。
2016-08-06 15:57
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:0 
float difference; 定义的difference是浮点型数据,也就是说是带小数点的数据类型
int *ptr_1 = &array1[2];
float *ptr_2 = &array2[1];这两个定义ptr_1和ptr_2都是指针,
同一个数组的话指针减指针还是指针啊,只是指向地址的位置改变了,你这个貌似是两个数组,相减没啥意义吧

[此贴子已经被作者于2016-8-8 09:35编辑过]

2016-08-06 20:16
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:0 
百度查了下一些资料,也给你看下参考参考吧;
如果两个指针向同一个数组,它们就可以相减,其为结果为两个指针之间的元素数目。仍以本章开头介绍的街道地址的比喻为例,假设我住在第五大街118号,我的邻居住在第五大街124号,每家之间的地址间距是2(在我这一侧用连续的偶数作为街道地址),那么我的邻居家就是我家往前第(124-118)/2(或3)家(我和我的邻居家之间相隔两家,即120号和122号)。指针之间的减法运算和上述方法是相同的。
在折半查找的过程中,同样会用到上述减法运算。假设p和q指向的元素分别位于你要找的元素的前面和后面,那么(q-p)/2+p指向一个位于p和q之间的元素。如果(q-p)/2+p位于你要找的元素之前,下一步你就可以在(q-p)/2+p和q之间查找要找的元素;反之,你可以停止查找了。
如果两个指针不是指向一个数组,它们相减就没有意义。假设有人住在梅恩大街110号,我就不能将第五大街118号减去梅恩大街110号(并除以2),并以为这个人住在我家往回第4家中。
如果每个街区的街道地址都从一个100的倍数开始计算,并且同一条街的不同街区的地址起址各不相同,那么,你甚至不能将第五大街204号和第五大街120号相减,因为它们尽管位于同一条街,但所在的街区不同(对指针来说,就是所指向的数组不同)。
C本身无法防止非法的指针减法运算,即使其结果可能会给你的程序带来麻烦,C也不会给出任何提示或警告。
指针相减的结果是某种整类型的值,为此,ANSIC标准<stddef.h>头文件中预定义了一个整类型ptrdiff_t。尽管在不同的编译程序中ptrdiff_t的类型可能各不相同(int或long或其它),但它们都适当地定义了ptrdiff_t类型。
2016-08-08 09:34
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
你要相减的坑定不会是这两个指针。。。你要求差的应该是这两个 指针所指向的地址 上的元素 的值

要用上*(取值运算符),同时也要注意这是两个不同类型的数值原则上计算结果是一个浮点类型(不同精度的数值进行运算,会把精度低的元素转换为精度高的,返回结果回事精度更高的那一个)。所以在printf里面也应该用%f

φ(゜▽゜*)♪
2016-08-08 09:45
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

另外,我也建议不要把函数声明都放到全局去,完全没必要。。
程序代码:
#include <stdio.h>



int main(void) {
   

    int array1[3] = { 6, 8, 9 };
float array2[2] = { 2, 3 };
int *ptr_1 = &array1[2];

float difference;

float *ptr_2 = &array2[1];
   

   

    difference = *ptr_1 - *ptr_2;
    printf("%f", difference);
    return 0;
}


φ(゜▽゜*)♪
2016-08-08 09:48
zx315
Rank: 5Rank: 5
来 自:广东
等 级:职业侠客
威 望:2
帖 子:86
专家分:378
注 册:2016-7-13
收藏
得分:0 
# 指针的算术运算

C 语言支持 3 种(而且只有 3 种)格式的指针算术运算:

1. 指针加上整数
2. 指针减去整数
3. 两个指针相减

> 在一个不指向任何数组元素的指针上执行算术会导致未定义的行为。

# 指针比较

可以用关系运算符(`<`, `<=`, `>`, `>=`) 和判等运算符(`==`, `!=`)进行指针比较。

> 只有在两个指针指向同一数组时,关系运算符进行的指针比较才有意义。


===

C 语言规则如此~

Read The Fucking Source Code~
2016-08-09 00:05
砖家的谎言
Rank: 12Rank: 12Rank: 12
等 级:禁止访问
威 望:30
帖 子:693
专家分:3898
注 册:2013-12-6
收藏
得分:0 
解决了吗

我不是砖家,要努力成为砖家。
2016-08-09 08:18
davidguhao
Rank: 1
来 自:广东
等 级:新手上路
帖 子:126
专家分:7
注 册:2016-7-18
收藏
得分:0 
回复 2楼 linlulu001
指针本身是相同类型的吧……(lll¬ω¬)

暨南大学市场营销……
但是我有一颗计算机专业的心……
2016-08-09 09:31
cppyjou
Rank: 2
等 级:论坛游民
威 望:1
帖 子:10
专家分:16
注 册:2016-8-4
收藏
得分:0 
指针本来是存放指向的地址,不能直接这样相减吧
前面要加上*才表示这个指针所地址里面的内容
2016-08-09 14:13
快速回复:关于指针求差问题
数据加载中...
 
   



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

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