这是一个指针式的数学问题
//code
#include<iostream>
using namespace std;
int main()
{
int a=20,b=50,*p,*q;
p=&a;
q=&b;
int c=p-q;
cout<<c; //Here I'm getting 1 for all positive value of 'a' and 'b'
return 0;
}
我也尝试了long int c
答案 0 :(得分:1)
首先,您要减去指针,而不是取消引用的指针。如果希望通过指针从z=input('Does the creature have gills? ')
if z==('yes') or ('yeah'):
print ('It is a fish!')
elif z=='no':
print('The creature is not a fish.')
中减去a
的值,则需要使用b
和*p
。
对于编写的代码,实际上不保证将在此处输出什么。换句话说,没有单一的“正确”答案。您正在获取两个自动分配的变量的地址。允许编译器将它们放在任意位置,因此不能保证它们分开的距离。
不过,通常情况下,编译器会将它们并排放置在堆栈中。因此,如果减去它们的地址,则通常以1或-1结尾。
请注意,指针的类型为*q
,因此指针上的指针算术将不是 以字节为单位(也许正是您所期望的?),而是{ {1}}。
还要注意,根据标准,内存“对象”之外的指针算术并不是严格定义好的(请参阅“未定义的行为”),尽管大多数实现(编译器)都不会因为这种类型的行为而对您不利直接进行“距离”测量,因为它通常用于实现树数据结构等。 (至少在具有线性地址空间的现代平台上。)
答案 1 :(得分:0)
int c = p - q;
您减去指针p
和q
本身的值-实际上是存储器中a
和b
的地址,并将结果分配给{{1} } int
。
如果要将值c
(20
)减去a
(50
),则需要取消引用指针b
和{{ 1}}由p
运算符获取它们指向的对象的值。
改为使用q
。
如果要减去指针本身的值,则需要考虑以下几点:
在大多数情况下,*
不能保存存储位置的编号。分配一个超出int c = *p - *q;
范围的数字将调用undefined behavior。要存储内存地址的编号,至少需要一个int
。
减法是由指针类型本身进行的。因此,int
的结果。
您需要将long int
定义为1
类型,并将两个指针都转换为c
:
long int
输出:
long int
请注意,对象#include <iostream>
using namespace std;
int main (void)
{
int *p, *q;
int a = 20, b = 50;
p = &a;
q = &b;
long int c = (long int) p - (long int) q;
cout << c;
}
和4 (at my execution)
都不需要随后存储在内存中。 a
并不总是4,尽管在大多数现代实现中都很常见。