我在带有gcc 7.5.0
的32位机器中运行一个C程序。
为什么第二个数字14的值大于第一个数字?
#include <stdio.h>
int main(void)
{
int a[5];
printf("%pn", &a);
printf("%pn", &a+1);
return 0;
}
结果是:
0x7ffd7293f560
0x7ffd7293f574
为什么第二个数字比第一个数字多14?
对象a
声明为:
int a[5];
并且具有等于CCD_ 3的大小(根据输出(。
因此表达式&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)%zxn",
sizeof( a ), sizeof( a ) );
return 0;
}
其输出为
sizeof( a ) = (in decimal)20 and (in hex)14
下面是指针算术的一个简化示例。
#include <stdio.h>
int main(void)
{
int a[5] = { 1, 2, 3, 4, 5 };
printf( "%p => %dn", ( void * )&a[0], a[0] );
printf( "%p => %dn", ( void * )( &a[0] + 1 ), *( &a[0] + 1 ) );
return 0;
}
程序输出可能看起来像
0x7ffe2bfb4840 => 1
0x7ffe2bfb4844 => 2
正如您所看到的,地址值之间的差值等于4,即表达式sizeof( int )
的值。在问题中的程序中,使用了一个类型为int[5]
的对象,其大小为20
(5 * sizeof( int )
(。
为什么第二个数字比第一个数字多14?
它是20(dec(,因为int a[5]
的大小是20(4*5((假设int
在您的平台上是4(,因此&a+1
将增加20(十六进制中=14(。
你想这么做吗?
#include <stdio.h>
int main(void)
{
int a[5];
printf("%pn", a);
printf("%pn", a+1);
return 0;
}
输出:
0060FEEC
0060FEF0
Process returned 0 (0x0) execution time : 0.088 s
Press any key to continue.
区别在于
0060FEF0-0060FEEC=4