【问题标题】:Why is the value of the second number 14 more than the first number?为什么第二个数字的值 14 比第一个数字大?
【发布时间】:2020-07-06 21:00:17
【问题描述】:

我使用gcc 7.5.0 在 32 位机器上运行 C 程序。

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

#include <stdio.h>
int main(void)
{
    int a[5];
    printf("%p\n", &a);
    printf("%p\n", &a+1);
    return 0;
}

结果是:

0x7ffd7293f560
0x7ffd7293f574

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

【问题讨论】:

  • 区别是20:0x...74 - 0x...60 = 0x00..0014 = 16 + 4 = 20

标签: c pointers pointer-arithmetic


【解决方案1】:

对象a被声明为:

int a[5];

并且大小等于20(根据输出)。

所以表达式&amp;a+1 使用指针算法,将指针&amp;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;
}

它的输出是

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 => %d\n", ( void * )&a[0], a[0] );
    printf( "%p => %d\n", ( void * )( &a[0] + 1 ), *( &a[0] + 1 ) );

    return 0;
}

程序输出可能看起来像

0x7ffe2bfb4840 => 1
0x7ffe2bfb4844 => 2

如您所见,地址值之间的差异等于 4,即表达式 sizeof( int ) 的值。在您的问题程序中,使用了 int[5] 类型的对象,其大小为 20 ( 5 * sizeof( int ) )。

【讨论】:

    【解决方案2】:

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

    它是 20(dec) 因为int a[5] 的大小是 20 (4*5)(假设大小为 int 在您的平台上是 4),所以 &amp;a+1 会增加 20(= 十六进制的 14)。

    你想这样做吗?

     #include <stdio.h>
    
     int main(void)
     {
         int a[5];
         printf("%p\n", a);
         printf("%p\n", a+1);
         return 0;
     }
    

    输出:

    0060FEEC
    0060FEF0
    
    Process returned 0 (0x0)   execution time : 0.088 s
    Press any key to continue.
    

    区别是

    0060FEF0-0060FEEC=4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      相关资源
      最近更新 更多