在以下代码中:
#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上访问值?)
答案 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
。