Объект 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 )
).