В чем разница между `* a` и` a [0] `?
Учитывая заданный пользователем тип A
и указатель A* a
, в чем разница между *a
и a[0]
?
(Хотя *(a+0)
/a[0]
определены как эквивалентные, то же самое не относится к *a
/a[0]
, где тонкая разница может привести к ошибке компиляции при определенных обстоятельствах.)
Ответы
Ответ 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