Почему значение второго числа 14 больше первого числа? - PullRequest
0 голосов
/ 26 марта 2020

Я запускаю программу C на 32-битной машине с 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;
}

Результат:

0x7ffd7293f560
0x7ffd7293f574

Почему второе число еще на 14 чем первое число?

Ответы [ 2 ]

6 голосов
/ 26 марта 2020

Объект a объявлен как:

int a[5];

и имеет размер, равный 20 (в соответствии с выводом).

Таким образом, выражение &a+1 использует арифметика указателя c, увеличивающая значение указателя &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

Вот упрощенный пример арифметики указателя c.

#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 )).

4 голосов
/ 26 марта 2020

Почему второе число на 14 больше первого?

Это 20 (de c), потому что размер int a[5] равен 20 (4 * 5) (предполагается, что размер int равен 4 на вашей платформе), поэтому &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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...