解析指针算术

resolving the 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。 为什么即使只将 1 添加到 p 的值,这些值之间仍存在 00000008 的差距?

I tried using %d in place of %p to output pointer's value but still it had a difference of 8.

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

Why there is this gap of 00000008 between these values even when only 1 is added to p's value ?

因为双精度类型的大小在您的机器上大概是 8 个字节。这就是所谓的指针算术。因此,当您向指针添加 1 时,由于指针的大小,实际上会向其添加 8 个字节。

is there any other way to access a value at address lying between this gap of 00000008 bytes?

是的,在进行指针运算之前,您需要将指针 say 转换为 char *

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

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

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

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

也是