返回地址和返回指针之间的区别

时间:2017-07-14 16:42:23

标签: c pointers

#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?

5 个答案:

答案 0 :(得分:4)

程序的行为未定义。

指针算法 - 包括两个指针之间的差异 - 仅在数组中有效(包括在arrray结尾之后的一个),或者在标量的地址和过去的那个之间有效。

从int到指向int的指针的转换行为也是未定义的。

如果两个指针之间确实存在有效差异,则使用格式说明符%td输出它。

答案 1 :(得分:3)

m的地址未存储在x中,因为您没有为其分配m的地址。您为m分配了。您应用的强制转换掩盖了您试图将一个整数分配给指针的事实,编译器会向您发出警告。

如果您想使用变量的地址,请使用地址运算符&

int *x=&m;
int *y=&n;

关于为什么输出为5,你是正确的。mn的值被分配给指针,因此被视为地址。

但是请注意,除非两个操作数都指向同一个数组的成员(或者超过该数组末尾的成员),否则指针减法是未定义的。另请注意,使用%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;变量来执行此操作