指针运算:没有赋值的地址保存另一个地址的值

时间:2015-07-27 20:52:23

标签: c pointers

为什么地址px+1保持值为0.3? (在每次执行时)变量f的值也为0.3,但它有另一个地址(px-1)!? (即使px+2px+3px-2上的值保持值0.3 ......,当我将其打印出来时)

#include <stdio.h>

int main(){
  int* px;
  int i = 1;
  float f= 0.3;
  double d=0.005;
  char c = '*';

  px=&i;
  printf("Values: i=%i f=%f d=%f c=%c\n",i,f,d,c);

  printf("Addresses: i=%lX f=%lX d=%lX c=%lX\n",&i,&f,&d,&c);

  printf("Pointer Values (size of int = %d):\n px=%lX; px+1=%lX;  px+2=%lX;  px+3=%lX\n",sizeof(int),px,px+1,px+2,px+3);

  printf("Dereference: at px+1=%lX, value is:%f \n",px+1,*(px+1));

  /* Output :
Values: i=1 f=0.300000 d=0.005000 c=*
Addresses: i=7FFF5C546BB4 f=7FFF5C546BB0 d=7FFF5C546BA8 c=7FFF5C546BA7
Pointer Values (size of int = 4):
 px=7FFF5C546BB4; px+1=7FFF5C546BB8;  px+2=7FFF5C546BBC;  px+3=7FFF5C546BC0
Dereference: at px+1=7FFF5C546BB8, value is:0.300000 
   */

}

2 个答案:

答案 0 :(得分:2)

您有几个问题,都导致未定义的行为。首先,您应该使用"%p"来打印指针,并且指针应该被转换为void *以获得最大的兼容性。其次,取消引用超出范围的指针,就像你*(px + 1)导致未定义的行为一样。第三,指针px指向整数,但您尝试使用float转换进行打印,这也会导致未定义的行为。

答案 1 :(得分:0)

通过编写*(px+1),您尝试访问超出范围的内存。它调用undefined behaviour

另外,

  • 要打印地址,您应该使用%p格式说明符。
  • 要打印int,您应该使用%d%i