解析指针算术

时间:2016-01-15 18:18:40

标签: c++ c pointers pointer-arithmetic

在以下代码中:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int main()
{

   double *p= (double *)malloc(sizeof(double)*5);
   double *s= (double *)malloc(sizeof(double));

   printf("Enter first value: "); scanf("%lf",p);
   printf("\nEnter 2nd value: "); scanf("%lf",p+1);
   printf("\nEnter 3rd value: "); scanf("%lf",p+2);

   printf("\n\ntable is:\n");
   printf("1st value %f\taddress: %p\n",*p,p);
   printf("2nd value %f\taddress: %p\n",*(p+1),(p+1));
   printf("3rd value %f\taddress: %p\n",*(p+2),(p+2));
   printf("\n\n\nvalue %f\taddress: %p\n",*s,s);

return 0;}

现在假设指针 p 包含十六进制值00BD0D50。但是当我使用 p + 1 时获得的地址将给出十六进制值。 00BD0D58。 为什么这些值之间存在00000008的差距,即使只有1加到 p 的值?

  

我尝试使用%d 代替%p 来输出指针的值但仍然有8的差异。

如果它背后有某些原因,是否还有其他方法可以访问位于00000008字节间隙之间的地址值? (例如在上面的例子中,有没有办法在00BD0D51上访问值?)

2 个答案:

答案 0 :(得分:0)

  

为什么这些值之间存在00000008的差距,即使只是   1加到p的值?

因为双重类型的大小大概是在您的机器上的8字节。那叫做指针算术。因此,当您向指针添加1时,实际上由于指针对象的大小,会向其添加8个字节。

  

有没有其他方法来访问位于此之间的地址的值   差距为00000008字节?

是的,你需要在执行指针算术之前将指针转换为char *

PS。在尝试打印*s的值时,您还有未定义的行为 - 因为它尚未初始化。

使用%p格式说明符时,您需要将指针转换为void*中的printf,例如

 printf("1st value %f\taddress: %p\n",*p, (void*) p);

答案 1 :(得分:0)

这是指针算术! p+1是内存中下一个double的地址。由于double的长度为8个字节,因此p+1