将数字与指针相加

Tan*_*aje 2 c pointers pointer-arithmetic

#include<stdio.h>
int main()
{  
     float a=10;
     float* p=&a;
    printf("%u\n",p);
     p=p+3;
     printf("%u",p);
}
Run Code Online (Sandbox Code Playgroud)

执行该程序后,我得到 2 个内存地址作为输出,后者的值比前者大 12。

#include<stdio.h>
int main()
{  
     float a=10;
     float* p=&a;
    printf("%u\n",p);
     p=p+3.5;
     printf("%u",p);
}
Run Code Online (Sandbox Code Playgroud)

我尝试将 3 更改为 3.5,但得到的输出具有两个地址的相同值。我预计在这两种情况下该值都会至少增加 12。可能是什么原因 ?

Gil*_*il' 5

这就是指针算术的工作原理。它被设计为在数组上工作。

float array[4];
float *q;
q = array; /* Now q points to the first element of the array: q == &array[0] */
printf("%p\n", q);
q += 3; /* Now q points to the fourth element of the array: q == &array[3] */
printf("%p\n", q);
Run Code Online (Sandbox Code Playgroud)

当您向指针添加一个整数时,它会将这些元素进一步指向数组。如果数组元素的大小为 N 字节,则将 x 添加到指针会将 x*N 添加到地址。

在您的计算机上,显示为sizeof(float)4:您会看到 x*N=12,其中 x=3,因此 N=4。

请注意,您的代码中有几个错误。在您的程序中,p=p+3具有未定义的行为,因为p它指向单个浮点数(其内存布局与 1 个浮点数的数组相同)。将指针指向对象边界之外是错误的。在典型的 PC 编译器上,您只是默默地得到一个无效的指针;极少数实现会在计算出无效指针后立即检测到该指针,并因错误而中止程序。

用 打印指针值%u也是一个错误。实际上,它可能会工作、打印垃圾或崩溃,具体取决于您的编译器以及指针的大小是否与unsigned int. 任何还算不错的编译器都会警告你这printf("%u", p)是不正确的;如果您的没有,请确保启用其有用的警告(例如gcc -O -Wall,如果您使用的是 GCC)。