Задачи по языку С



         

Примечание редактора электронного издания.


Еще одно непонятное несоответствие у м-ра Фьюера. Если PRINT2 и PRINT3

определены как у него, то только первый их входящих в макроопределение операторов попадет в тело цикла. Если же как у нас - то все. Подробности см. в примечаниях к и к

Ссылки и массивы 3.1.

Переменная a - матрица 3х3 со строками 1 2 3, 4 5 6 и 7 8 9.
int a[3][3] = { { 1,2,3 }, { 4,5,6 }, { 7,8,9 } }; Выражение a[i][j] относится к целому, находящемуся на расстоянии j от начала строки i. Значение a есть адрес первой строки матрицы a. Таким образом, a - ссылка на массив целых из трех элементов и a[] - ссылка на целое.
int *pa[3] = { a[0],a[1],a[2] }; Выражение *pa[] приводится к целому, значит, pa[] - ссылка на целое, а pa - массив ссылок на целое. Элемент pa[0] инициируется первым элементом из первой строки a, pa[1] инициируется первым элементом из второй строки, pa[2] - первым элементом третьей строки.
int *p = a[0]; Ссылка p есть ссылка на целое, первоначально указывающая на первый элемент первой строки матрицы a.


Рис.3.1

Ссылки и массивы 3.2.

for ( i=0; i В цикле i принимает значения от 0 до 2.
a[i][2-i] Выражение a[i][2-i] выбирает диагональные элементы от a[0][2] до a[2][0].
*a[i] *a[i] - адрес первого элемента i-й строки.
*(*(a+i)+i) a+i - адрес i-й строки a, *(a+i) - адрес первого элемента i-й строки, *(a+i)+i - адрес i-го элемента из i-й строки. Наконец, *(*(a+i)+i) дает целое значение i-го элемента i-й строки.

Ссылки и массивы 3.3.

for (i=0; i В цикле i принимает значения от 0 до 2.
*pa[i] pa[i] относится к i-му элементу из pa, *pa[i] дает целое число, на которое указывает i-й элемент pa.
p[i] Ссылка p указывает на первый элемент первой строки матрицы a. Так как базовый тип ссылки p - int, то p[i] дает i-й элемент первой строки из a.

Об адресах массива. Мы уже несколько раз указывали, что адрес массива и адрес первого элемента массива есть одно и то же значение. В предыдущей задаче мы видели, что a и a[0] сводятся к одному и тому же адресу. Единственное различие между адресом массива и адресом первого элемента массива заключается в типе адреса, а значит, в единице измерения адресной арифметики. Таким образом, поскольку тип a - ссылка на массив целых из трех элементов, базовый тип a - массив целых из трех элементов, и a+1 указывает на следующий в памяти массив из трех чисел. В то же время тип a[0] - ссылка на целое, базовый тип a[0] - int и a[0]+1 указывает на следующее в памяти целое.




Содержание  Назад  Вперед