Хрестоматия по программированию на Си в Unix


Массивы, строки, указатели. Хрестоматия по программированию на Си в Unix - стр. 3


Следствием такой интерпретации имен массивов является то, что для того чтобы поставить указатель на начало массива, надо писать

ptr = array; или ptr = &array[0]; но не ptr = &array;

Операция & перед одиноким именем массива не нужна и недопустима!

Такое родство указателей и массивов позволяет нам применять операцию * к имени массива: value = *array; означает то же самое, что и value = array[0];

Указатели - не целые числа! Хотя физически это и номера байтов, адресная арифметика отличается от обычной. Так, если дан указатель TYPE *ptr; и номер байта (адрес), на который указывает ptr, равен byteaddr, то

ptr = ptr + n; /* n - целое, может быть и < 0 */

заставит ptr указывать не на байт номер byteaddr + n, а на байт номер

byteaddr + (n * sizeof(TYPE))

то есть прибавление единицы к указателю продвигает адрес не на 1 байт, а на размер указываемого указателем типа данных! Пусть указатель ptr указывает на x-ый элемент массива array. Тогда после

TYPE *ptr2 = array + L; /* L - целое */ TYPE *ptr1 = ptr + N; /* N - целое */ ptr += M; /* M - целое */

указатели указывают на

ptr1 == &array[x+N] и ptr == &array[x+M] ptr2 == &array[L]

Если мы теперь рассмотрим цепочку равенств

*ptr2 = *(array + L) = *(&array[L]) = array[L]

то получим ОСНОВНОЕ ПРАВИЛО: пусть ptr - указатель или имя массива. Тогда операции индексации, взятия значения по адресу, взятия адреса и прибавления целого к указателю связаны соотношениями:

ptr[x] тождественно *(ptr+x) &ptr[x] тождественно ptr+x

(тождества верны в обе стороны), в том числе при x==0 и x < 0. Так что, например,

ptr[-1] означает *(ptr-1) ptr[0] означает *ptr

Указатели можно индексировать подобно массивам. Рассмотрим пример:

/* индекс: 0 1 2 3 4 */ double numbers[5] = { 0.0, 1.0, 2.0, 3.0, 4.0 }; double *dptr = &numbers[2]; double number = dptr[2]; /* равно 4.0 */ numbers: [0] [1] [2] [3] [4] | [-2] [-1] [0] [1] [2] dptr




- Начало -  - Назад -  - Вперед -