#include <stdio.h>
#include <conio.h>
void main()
{
int m = 20;
int n = 30;
int *x = (int *)m;
int *y = (int *)n;
printf("%d", y-x); //Output is 5
}
输出5怎么样?其中一个原因可能是x和y将20和30视为地址,在指针运算期间,该值可能是(30-20)/(int的大小),即10/2 = 5。
我怀疑返回指针和返回地址有什么区别?为什么m的地址没有存储在指针变量x?
中答案 0 :(得分:4)
程序的行为未定义。
指针算法 - 包括两个指针之间的差异 - 仅在数组中有效(包括在arrray结尾之后的一个),或者在标量的地址和过去的那个之间有效。
从int到指向int的指针的转换行为也是未定义的。
如果两个指针之间确实存在有效差异,则使用格式说明符%td输出它。
答案 1 :(得分:3)
m
的地址未存储在x
中,因为您没有为其分配m
的地址。您为m
分配了值。您应用的强制转换掩盖了您试图将一个整数分配给指针的事实,编译器会向您发出警告。
如果您想使用变量的地址,请使用地址运算符&
:
int *x=&m;
int *y=&n;
关于为什么输出为5,你是正确的。m
和n
的值被分配给指针,因此被视为地址。
但是请注意,除非两个操作数都指向同一个数组的成员(或者超过该数组末尾的成员),否则指针减法是未定义的。另请注意,使用%d
格式说明符打印指针是未定义的行为。您需要改为使用%p
,并且需要将给定参数强制转换为void *
(这是极少数情况下需要强制转换为void *
)。
答案 2 :(得分:0)
如果要将m的地址存储在x中,只需执行int * x =&amp; m; 这里转换为int类型指针导致我的选择问题。 如果你想计算y-x的值,那么做* y- * x。因为它在你的代码中你计算了n的地址 - m的地址。
答案 3 :(得分:-1)
如果要显示存储在指针中的地址,则必须使用%p。在您的代码中,您应该在指针名称之前使用*。
#include<stdio.h>
int main()
{
int m=20; int n=30;
int *x= &m;
int *y= &n;
printf("\n%d", (*y)-(*x)); //Output is 10
printf("\n%p address of m", x);
printf("\n%p address of n", y);
return 0;
}
答案 4 :(得分:-2)
int *x=(int *)m;
int *y=(int *)n;
通过这样做,你将要做的是 -
在指针x
中 - 您输入值m
(将此视为指针以及您正在执行int *
。
因此x
的值为20(0x14),y
的值为30(0x1E)。
指针算法与普通算术运算有点不同 https://www.tutorialspoint.com/cprogramming/c_pointer_arithmetic.htm
关于分配地址,您应该使用&amp;变量来执行此操作