c-为什么第二个数字14的值大于第一个数字



我在带有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

最新更新