为什么第二个数字的值比第一个数字大 14?

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?

Vla*_*cow 6

该对象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 ))的类型的对象。