Просто для уточнения правильного ответа Дмитрия Колчева:
A &
при использовании в коде извлекает адрес объекта:
int i = 15; /* Integer, contains '15' */
int* pi = &i; /* Pointer to an integer, contains the address of i in memory*/
Теперь у вас есть массив, подобный
int array [3] = {1, 2, 3};
Тогда
assert(1 == array[0]);
assert(2 == array[1]);
assert(3 == array[3]);
имеет место.
array[i]
извлекает содержимое массива в позиции i
.
&array[i]
обозначает адрес памяти элемента в позиции i
:
int a0 = array[0]; /* array[0] is of type int */
int* ap0 = &array[0]; /* &array[0] is of type int* */
Кстати, array[i]
- это просто короткая рука для *(array + i)
, а &array[0]
равняется array + i
:
assert(array[i] == *(array + i));
assert(&array[i] == array + i);
Но это немного другая история ...