0 c pointers pointer-arithmetic
我在 32 位机器上运行一个 C 程序gcc 7.5.0。
为什么第二个数字的值比第一个数字大 14?
#include <stdio.h>
int main(void)
{
int a[5];
printf("%p\n", &a);
printf("%p\n", &a+1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果是:
0x7ffd7293f560
0x7ffd7293f574
Run Code Online (Sandbox Code Playgroud)
为什么第二个数字比第一个数字大 14?
该对象a声明为:
int a[5];
Run Code Online (Sandbox Code Playgroud)
并且大小等于20(根据输出)。
因此该表达式&a+1使用指针算法,&a通过对象的大小增加指针的值a。由于14十六进制值为20,即对象的大小a。
这是一个演示程序
#include <stdio.h>
int main(void)
{
int a[5];
printf( "sizeof( a ) = (in decimal)%zu and (in hex)%zx\n",
sizeof( a ), sizeof( a ) );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它的输出是
sizeof( a ) = (in decimal)20 and (in hex)14
Run Code Online (Sandbox Code Playgroud)
这是指针运算的简化示例。
#include <stdio.h>
int main(void)
{
int a[5] = { 1, 2, 3, 4, 5 };
printf( "%p => %d\n", ( void * )&a[0], a[0] );
printf( "%p => %d\n", ( void * )( &a[0] + 1 ), *( &a[0] + 1 ) );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
程序输出可能看起来像
0x7ffe2bfb4840 => 1
0x7ffe2bfb4844 => 2
Run Code Online (Sandbox Code Playgroud)
如您所见,地址值之间的差异等于 4,即表达式的值sizeof( int )。在问题中的程序中,使用int[5]了大小为20( 5 * sizeof( int ))的类型的对象。