Массивы целых или вещественных чисел можно инициализировать следующим образом:
int ar1[10] = { 1, 5, -2, 3};
double ar2[15] = { -2.1, 5.23, 56.191 };
Первые ячейки массивов заполняются указанными константами.
Если используется инициализация, то размер массивов может быть не указан явно:
int ar3[] = { 1, 5, -2, 3};
double ar4[] = { -2.1, 5.23, 56.191 };
В этом случае размер массива определяется по количеству элементов в списке иинициализации, то есть в массиве ar3 четыре элемента, а в массиве ar4 – три.
Кроме типов целого и вещественного числа, в языке C имеется тип символа: char.
Массив символов можно инициализировать аналогично массивов других типов:
char str1[] = { 'A', 'B', 'C', 'D', 'E' };
Массив str1 содержит 5 элементов: коды символов 'A', 'B', 'C', 'D', 'E' в кодировке ASCII.
Nакже массивы символов можно инициализироваться строковыми константами:
char str2[] = “ABCDE”;
В этом случае размер массива str2 6 символов, так как строковые константы содержат на конце дополнительный байт со значением, равным 0. Этот байт часто используется в библиотечных функциях для определения конца строки.
Пример 1. Копирование строки символов. Функция strcpy() копирует строку src в dst и возвращает адрес dst:
char *strcpy(char *src, char *dst) {
char *p = dst;
while (*(dst++) = *(src++)); /* Копировать символ из src в dst пока не скопирован 0 */
return p;
}
Пример 2. Сравнение двух строк. Функция strcmp() возвращает отрицательное число, если строка str1 меньше str2, положительное число, если str1 больше str2, и 0, если строки равны:
int strcmp(char *str1, char *str2) {
while (*str1) { /* Пока не конец строки str1 */
if (*str1 < *str2) /* Если очередной символ строки str1 меньше *.
/* соответствующего символа строки str2 */
return -1; /* результат := меньше
if (*str1 > str2) /* Если очередной символ строки str1 больше */
/* соответствующего символ строки str2 */
return 1; /* результат := больше */
}
if (*str2 == 0) /* Если строка str2 тоже кончилась */
return 0; /* результат := строки равны */
else /* Иначе */
return -1; /* результат := меньше */
}
В языке C имеются операторы, действующие на битах своих операндов:
& - битовое «и»
| - битовое «или»
^ - битовое «исключающее или»
~ - битовое «не»
<< - сдвиг битов влево на заданное количество мест (в сторону старших битов; старшие биты теряются, младшие заполняются нулями)
>> - сдвиг битов вправо на заданное количество мест (в сторону младших битов; младшие биты теряются, старшие заполняются нулями)
Пример 3. Подсчет суммы битов в целом числе.
int x;
int mask = 1;
int res = 0;
while (mask) {
if (x & mask)
++res;
mask <<= 1;
}
Пример 4. Циклический сдвиг битов целого числа на одно место вправо: младший бит переходит в старший.
int x;
int mask = x & 1; /* Сохраним значение младшего бита числа */
x >>= 1;
while (mask << 1) { /* Пока сохраненный младший бит не дошел до старшего места */
mask <<= 1; /* сдвигаем его влево */
}
x |= mask; /* Присвоим старшему биту значение младшего бита */