难以理解指向指针增量值的指针

问题描述

请参考以下C程序,并在递增指针(即p)的同时正确地将其递增4个字节。如果我尝试增加指向指针的指针(即pp),则同样会增加8个字节。而且我不明白为什么会以这种方式发生,可能是我对该概念有误解。

#include <stdio.h>

int main()
{
float a = 5,*p,**pp;
p = &a;
pp = &p;
printf("a=%f,p=%p,pp=%p\n",a,p,pp);
a = a + 1;
p = p + 1;
pp = pp + 1;
printf("a=%f,pp);

return 0;
}

输出
a = 5.000000,p = 0x7ffc93c93374,pp = 0x7ffc93c93368
a = 6.000000,p = 0x7ffc93c93378,pp = 0x7ffc93c93370

解决方法

指针算术以指针指向的类型的大小为单位进行。在您的系统上,sizeof(float)4,因此递增p会增加4个字节。但是sizeof(float*)8,因为它是64位系统,因此递增pp会为其添加8字节。

,

要附加@Barmar的答案,我想指出的是,如果您有数组

T a[N];

其中T是某种类型,而N是某个值,则在像这样的指针声明之后

T *p = a;

指针p将指向数组a的第一个元素。该声明等同于

T *p = &a[0];

如果要增加指针p,自然会假定它指向数组a的第二个元素,即它的值将是表达式&a[1]的值。 S0您需要将等于数组p的元素大小的值添加到指针a的原始值,该值等于sizeof( T )

这种计算称为指针算术。

因此表达式

p + 1

++p

表示将值sizeof( T )添加到指针p中存储的值中。结果,指针表达式将指向数组的下一个元素。