Выражение (&a[0]+1)
дает &a[1]
Да.
и вывод должен быть 2
номер
но вывод вышеприведенного кода &a[1]
почему?
Вы спрашиваете об эффекте
printf("%u ",*(&a[0]+1));
. Мы установили, что (&a[0]+1)
эквивалентно &a[1]
. Отсюда следует, что *(&a[0]+1)
эквивалентно *(&a[1])
, что, в свою очередь, эквивалентно просто a[1]
. Значение a[1]
представляет собой массив , а не 2
, несмотря на тот факт, что 2
является значением первого элемента массива.
Ваш контекст не относится к числу тех немногих, в которых значения массива не распадаются на указатели, поэтому общий вызов функции фактически эквивалентен
printf("%u ", &a[1][0]);
Однако в этот момент мы натолкнулись на препятствие. Директива %u
должна соответствовать аргументу (повышенного) типа unsigned int
, а фактический аргумент вместо этого имеет тип указателя. Это несоответствие приводит к неопределенному поведению. Это правдоподобно, но отнюдь не гарантировано, что это проявляется для вас в виде печати десятичного целого числа, соответствующего части или всей битовой комбинации указателя.
Если вы хотите напечатать нулевой элемент a[1]
, то проще всего написать это просто как a[1][0]
, но вы также можете написать его как *a[1]
или **&a[1]
или **(&a[0] + 1)
или во многих других формы.