В чем разница между `* a` и` a [0] `? - программирование
Подтвердить что ты не робот

В чем разница между `* a` и` a [0] `?

Учитывая заданный пользователем тип A и указатель A* a, в чем разница между *a и a[0]?

(Хотя *(a+0)/a[0] определены как эквивалентные, то же самое не относится к *a/a[0], где тонкая разница может привести к ошибке компиляции при определенных обстоятельствах.)

4b9b3361

Ответ 1

Если A является неполным типом, *a работает, но a[0] не работает, в этом примере:

struct A;

void foo(A& r)
{
}

void bar(A* a)
{
    foo(*a);
    foo(a[0]);   // error: invalid use of incomplete type ‘struct A’
}

Это потому, что a[0] эквивалентно *(a+0), но вы не можете добавить что-то к указателю на объект неполного типа (даже не нуль), потому что для арифметики указателя требуется, чтобы размер был известен.

Ответ 2

Если a является указателем на массив типа A,

то *a и a[0] совпадают до тех пор, пока A не будет полностью определен определяемым пользователем типом.

Если A не является полным, арифметика указателя нуждается в размере A, чтобы быть известна и, следовательно, [0] выдала бы ошибку.

Основная концепция массива

*(a+1) = a[1]
*(a+2) = a[2]

И *(a+0)/a[0] и *a/a[0] также совпадают. конечно, равно 1.

(a+0) = a относительно памяти. или адрес 0xDEADCODE + 0 = 0xDEADCODE