Связь между адресной арифметикой и индексированием массивов
Значение переменной или выражения типа массив есть адрес нулевого элемента.
Пример 4:
int a [5], * pa, * pm
pa = & a [0]; pm = a; / * эквивалентны записи * /
Поэтому эквивалентны следующие выражения:
a [i] * (a + i)
& A [i] a + i
pa [i] * (pa + i)
Указатели по обычные переменные можно объединять в массив.
Различие между именем массива и указателем (в роли именi массива)
Указатель - переменная, поэтому допустимо использовать указатели в выражениях со сменными.
Допустим :
int * pa; int a [5]
pa = a; / * -> на a [0] * /
pa + +; / * -> на a [1] * /
Недопустимо :
int * pa;
int a [5];
a = pa;
а + +;
- Изменять начальный адрес массива невозможно.
- Имя массива не является переменной.
В Си нет операций над массивами в целом.
Буквенные указатели
В Си нет строчного типа данных.
Строчная константа - это массив букв (символов).
Количество байтов: количество букв +1 (для символа \ 0 (конец строки)).
Пример 5:
char * pstr;
pstr = "с указателем";
- Строка не копируется, а копируется указатель на этот массив
Так же строка может быть промоделирован как буквенный указатель.
Различия между декларациями строк как массива и с помощью указателя
Пример 6:
char s_str [] = "як_масив"
char * p_str = "з_покажчиком"
s_str:
- элементы s_str могут меняться;
- но s_str всегда ссылается на то же место в памяти; р_str: - при изменении указателя он будет ссылаться на другое р_str = "изменили";
Потому что в Си нет операций обработки массивов в целом, нельзя выполнять операции со строками.
|
|
Недопустимо:
s_str = "изменили";
Все функции для работы со строками в размещенные в бiблiтечному файле .
Массивы указателей
Дано текст, в котором фраза "номер рисунка" находится над рисунком, а название рисунка - под ним.
Превратить тест, чтобы "номер рисунка" находился под ним, а название - над рисунком.
1) Выбираем способ подачи текста
Строки текста - переменной длины , следовательно, нельзя текст представить следующим образом: V [N] [M] (!)
-> Використуемо массив указателей на тип данных char :
Пример 7:
# Define KL 100
int n1, n2; / * номера строки * /
char * V [KL]; / * текст * /
char * temp; / * временная переменная * /
int k; / * рабочая переменная * /
temp = V [n1];
V [n1] = V [n2];
V [n2] = temp;
k = KL; / * печать текста * /
while (k -> 0)
printf ("% S \ n", * V + +);
Инициализация массивов указателей
Пример 8:
/ * Массив наименований месяцев года * /
char * m_name [] = {"ошибка", "январь", "февраль", "март", "апрель",
"Май", "июнь", "июль", "август", "сентябрь",
"Октябрь", "ноябрь", "декабрь"};
/ * Обращение по номеру месяца * /
|
|
(N <1 | | n> 12)? m_name [0]: m _name [n];
Многомерные массивы
Пример 9:
/ * Массив праздничных дней * /
int mpr [2] [7] =
= {{1, 7, 8, 1, 2, 9, 26, 24}, / * дни * /
{1, 1, 3, 5, 5, 5, 6, 8} / * месяца * /
};
/ * Обращение к элементам: * /
......
d_may1 = mpr [0] [3];
m_may1 = mpr [1] [3];
Указатели вместо многомерных массивов
Пример 10:
/ * 2 способа подачи двомiрних массивов * /
1) char a [3] [4];
2) char * b [3];
В первом случае массивы, которые являются строками матрицы, должны быть все обинаковой длины.
В втором случае строки могут быть разной длины, в этом заключается преимущество в работе с указателями. Чаще всего этим способом пользуются в работе со строками.
Функции обработки строк
Библиотека языка Си для работы со строками ( string.h )
strlen | strcat | strcpy | strcmp
strlen (S), S-строка (определяет длину строки) - количество информационных символов (без \ 0)
Пример 11:
int l;
l = strlen ("пример"); / * l = 6 * /
strcat (S1, S2) / * S1 + = S2 (конкатенация) * /
В строку S1 конкатенуеться копия строки S2, результат возвращается через имя функции. S1-зминютьеся, S2-не меняется.
Пример 12:
char a [30] = "Белеет", / * a = "Белеет" * /
b [] = "парус"; / * b = "парус" * /
strcat (a, b); / * a = "Белеет парус" * /
/ * B = "парус" * /
|
|
strcpy (S1, S2) / * S1 <= S2 (S1 = S2) * /
Строка S2 копiюеться в строку S2.
Пример 13:
char a [30] = "Белеет", / * a = "Белеет" * /
b [] = "парус"; / * b = "парус" * /
char * c;
strcpy (c, a); / * c = "Белеет" * /
strcat (c, b); / * c = "Белеет парус" * /
strcmp (S1, S2) / * Сравнение строк в лексiко-графическом порядке * / strcmp (S1, S2) = 0, если S1 = S2 strcmp (S1, S2) <> 0, иначе:
- > 0, если S1> S2
- <0, если S1 <S2
- = 0, если S1 = S2
Пример 14:
int r1, r2, r3;
char a [] = "ПС-08А", / * a = "ПС-08А" * /
b [] = "ПС-08б"; / * b = "ПС-08б" * /
char * c;
r1 = strcmp (a, c); / * r1 = 0 * /
r2 = strcmp (a, b); / * r1 <0 * /
r3 = strcmp (b, c); / * r1> 0 * /
Функции проверки свойств символов
Функции проверки свойств символов содержащихся в библиотецi ctype.h
Все функции имеют тип int (отвечают на вопрос "Есть ли символ ...?"). Результат функций равен 1, если "символ есть ...", i равен 0 иначе.
Эти функции имеют аргумент типа int .
isdigit | isalpha | isalnum | isupper | islower
isdigit (c) - проверяет, является ли аргумент c цифрой (0:9).
isalpha (c) - проверяет, является ли аргумент c латинской буквой.
isalnum (c) - проверяет, является ли аргумент c латинской буквой или цифрой.
isupper (c) - проверяет, является ли аргумент c большой латинской буквой (верхней регистр).
islower (c) - проверяет, является ли аргумент c малой латинской буквой (нижний регистр).
|
|
Пример 15:
int c1 = '9 ', c2 =' s ', c3 =' G ', c4 =' y ', c5 =' = ';
int r1, r2, r3, r4, r5;
r1 = isdigit (c1); / * r1 = 1 * /
r2 = isalpha (c2); / * r2 = 1 * /
r3 = isalnum (c1); / * r3 = 1 * /
r3 = isalnum (c5) / * r3 = 0 * /
r4 = isupper (c3); / * r4 = 1 * /
r5 = slower (c4); / * r5 = 1 * /
Функции преобразования строк
Функции преобразования строки в число содержащихся в библиотецi stdlib.h
atof | atoi | Atol | strtod | strtol | strtoul
Эти функции преобразуют строку цифр в целые значения и значения действительны.
atof - преобразует строку, представляющая действительное число, в значение типа double и возвращает значение этого типа.
Если аргумент функции не может быть преобразован (например, если первый символ строки не является цифрой), поведение функции atof не определено.
Пример 16:
# Include <stdlib.h>
main ()
{
double d;
d = atof ("99.0"); / * d = 99.0 * /
}
atoi - преобразует аргумент (строку цифр), что представляет целое число, в значение типа int и возвращает значение типа int. Если аргумент функции не может быть преобразован, то поведение функции atoi не определено.
Пример 17:
# Include <stdlib.h>
main ()
{
int i;
i = atoi ("2593"); / * i = 2593 * /
}
atol - преобразует аргумент (строку цифр), что представляет собой число типа длинное целое, в значение типа Long и возвращает занчение типа long .
Если аргумент функции не может быть преобразован, то поведение функции atol не определено. Если для хранения типа int и типа long используется 4 байта, то функции atoi и atolработают идентично.
Пример 18:
# Include <stdlib.h>
main ()
{
long l;
l = atol ("1000000"); / * l = 1000000 * /
}
strtod - преобразует последовательность символов, представляющих действительное число в значение типа double . Эта функция имеет два аргумента: строку (char *) и указатель строки.
Строка содержит последовательность символов, которые должны быть преобразованы в тип double .
Указателю присваивается адрес символа, является первым символом строки - остатка после преобразования части строки.
d = strtod (string, & stringPtr);
strtol - преобразует последовательность символов, представляющих целое число, в значение типа long . Эта функция имеет три аргумента: строку (char *), указатель строки и целое число.
Строка содержит последовательность символов, которые должны быть преобразованы.
Указателю присваивается адрес символа, является первым символом строки - остатка после преобразования части строки.
Целое число определяет основу счисления , по которой производится преобразование.
x = strtol (string, & remainderPtr, 0);
strtoul - преобразует последовательность символов, представляющих целое типа unsigned long в значение типа unsigned long . Эта функция работает аналогично strtol .
x = strtoul (string, & remainderPtr, 0);
Дата добавления: 2020-04-25; просмотров: 81; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!