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


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


Если функция должна знать длину массива - передавайте ее как дополнительный аргумент:

int sum( int a[], int len ){ int s=0, i; for(i=0; i < len; i++) s += a[i]; return( s ); } ... int arr[10] = { ... }; ... int sum10 = sum(arr, 10); ...

Количество элементов в массиве TYPE arr[N]; можно вычислить специальным образом, как

#define LENGTH (sizeof(arr) / sizeof(arr[0])) или

#define LENGTH (sizeof(arr) / sizeof(TYPE))

Оба способа выдадут число, равное N. Эти конструкции обычно употребляются для вычисления длины массивов, задаваемых в виде

TYPE arr[] = { ....... };

без явного указания размера. sizeof(arr) выдает размер всего массива в байтах.

sizeof(arr[0]) выдает размер одного элемента. И все это не зависит от типа элемента (просто потому, что все элементы массивов имеют одинаковый размер).

Строка в Си - это последовательность байт (букв, символов, литер, character), завершающаяся в конце специальным признаком - байтом '\0'. Этот признак добавляется компилятором автоматически, когда мы задаем строку в виде "строка". Длина строки (т.е. число литер, предшествующих '\0') нигде явно не хранится. Длина строки ограничена лишь размером массива, в котором сохранена строка, и может изменяться в процессе работы программы в пределах от 0 до длины массива-1. При передаче строки в качестве аргумента в функцию, функции не требуется знать длину строки, т.к. передается указатель на начало массива, а наличие ограничителя '\0' позволяет обнаружить конец строки при ее просмотре.

С массивами байт можно использовать следующую конструкцию, задающую массивы (строки) одинакового размера:

char stringA [ITSSIZE]; char stringB [sizeof stringA];

В данном разделе мы в основном будем рассматривать строки и указатели на символы.

Операции взятия адреса объекта и разыменования указателя - взаимно обратны.

TYPE objx; TYPE *ptrx = &objx; /* инициализируем адресом objx */ *(&objx) = objx;

&(*ptrx) = ptrx;

Вот пример того, как можно заменить условный оператор условным выражением (это удастся не всегда):




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



Книжный магазин