2016-07-12 5 views
1

Я читаю «Новый подход» и встретил прекрасную теорию. В чем разница между a[0] и &a[0], в двухмерном массиве a[i][j].Многомерные массивы и указатели

Отсюда следует, как:

int a[NUM_ROWS][NUM_COLS], *p, i; 

for(p = a[i]; p < a[i] + NUM_COLS; p++) 
*p = 0; 

Другое дело идет как:

int a[NUM_ROWS][NUM_COLS], (*p)[NUM_COLS], i; 

for(p = &a[0]; p < &a[NUM_ROWS]; p++) 
(*p)[i] = 0; 

Что разница между a[0] и &a[0]?

ответ

1

Учитывая декларацию

T a[N][M]; // for any type T 

следующие условия:

Expression  Type   Decays to   Value 
----------  ----   ---------   ----- 
     a  T [N][M]  T (*)[M]    Address of a[0] 
     &a  T (*)[N][M]  n/a     Address of a 
     *a  T [M]   T *     Address of a[0][0] 
     a[i]  T [M]   T *     Address of a[i][0] 
    &a[i]  T (*)[M]  n/a     Address of a[i] 
    *a[i]  T    n/a     Value of a[i][0] 
    a[i][j]  T    n/a     Value of a[i][j] 
    &a[i][j]  T *    n/a     Address of a[i][j] 

a, &a, a[0], &a[0] и &a[0][0] все дают то же значение (адрес массива совпадает с адресом первого элемента ar ray), но значения типов отличаются.

Поэтому, учитывая вышеупомянутую декларацию, выражение a[0] имеет тип T [M] (M -элементные массив T), который «затухает», чтобы ввести T *, если это не операнд оператора sizeof. Выражение &a[0] имеет тип T (*)[M] (указатель до M -элементный массив T).

Предположим декларации

T a[N][M]; 
T *p0 = a[0]; 
T (*p1)[M] = &a[0]; 

Первоначально p0 и p1 содержат одинаковое значение (адрес a[0][0]). Однако, если мы выполняем следующий код:

p0++; 
p1++; 

затем p0 будет содержать адрес a[0][1], а p1 содержит адрес a[1][0]. p0++ авансы p0, чтобы указать на следующий объект типа T, а p1++ авансы p1, чтобы указать на следующий объект типа T [M].

+0

ТЕПЕРЬ Я ПОНИМАЮ ВСЕ ЭТО. Благодаря! –

4

a[0] - первая строка в 2D-массиве и имеет тип int [NUM_COLS].

&a[0] - адрес этой строки и имеет тип int (*)[NUM_COLS].

В первом примере кода p имеет тип int *. Поскольку в определенных контекстах массив распадается на указатель на первый элемент, допустимо сделать p = a[i]. Затем p[n] и a[i][n] - то же самое.

Когда первый сегмент кода проходит через цикл for, он увеличивается на один на каждой итерации p, чтобы он указывал на последовательный элемент в строке. Таким образом, первый блок кода устанавливает каждый элемент в строке i в 0.

Во втором примере p имеет тип int (*)[NUM_COLS], поэтому вы можете присвоить ему адрес строки. По мере того, как цикл итерации, p увеличивается, так что он указывает на следующую строку . Так что код наборов блоков, каждый элемент в столбце i 0.

+1

Вы путаете строки и столбцы. 'a [0]' - первая строка и т. д. – Olaf

+0

@Olaf Хорошая уловка. Исправлена. – dbush

+0

Не исправлена! 'a [0]' имеет тип 'int [NUM_COLS]' и т. д. – Olaf

Смежные вопросы