解析指针算术
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
.
也是
在下面的代码中:
#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
.