C++ 解析指针算法

C++ 解析指针算法,c++,c,pointers,pointer-arithmetic,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); pri

在以下代码中:

#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;}
#包括
#包括
#包括
int main()
{
double*p=(double*)malloc(sizeof(double)*5);
double*s=(double*)malloc(sizeof(double));
printf(“输入第一个值:”;scanf(“%lf”,p);
printf(“\n输入第二个值:”);scanf(“%lf”,p+1);
printf(“\n输入第三个值:”);scanf(“%lf”,p+2);
printf(“\n\n表为:\n”);
printf(“第一个值%f\t地址:%p\n”,*p,p);
printf(“第二个值%f\t地址:%p\n”,*(p+1),(p+1));
printf(“第三个值%f\t地址:%p\n”,*(p+2),(p+2));
printf(“\n\n\n值%f\t地址:%p\n”,*s,s);
返回0;}
现在假设指针p包含十六进制值00BD0D50。但当我使用p+1时,从中获得的地址将给出十六进制值。00BD0D58。 为什么这些值之间存在00000008的差距,即使p的值只加了1

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

如果这背后有什么原因,有没有其他方法可以访问介于00000008字节之间的地址的值?(例如,在上述情况下,是否有办法访问00BD0D51处的值?)

为什么这些值之间存在0000000 8的差距,即使只有 p的值加上1

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

是否有其他方法访问位于这两个地址之间的地址处的值 00000008字节的间隙

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

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

另外,当使用
%p
格式说明符时,您需要在
printf
中将指针投射到
void*
,例如

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

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

您是否尝试打印
sizeof(double)
的值?哦,您确实知道表达式
*(p+i)
相当于
p[i]
?此外,当您打印
*s
的值时,您有未定义的行为。
malloc
函数不会初始化它分配的内存,因此其内容将是不确定的。使用未初始化的数据(初始化数据除外)会导致UB(未定义的行为)。