问题描述
请参考以下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
中存储的值中。结果,指针表达式将指向数组的下一个元素。