Лекция-10-Иванченко.ppt
- Количество слайдов: 15
Тема Указатели и массивы (продолжение) Лекция 04. 10. 11 г. 1
Символьные указатели Язык С не имеет отдельного типа данных для работы со строками символов и они представляются массивами символов char[]. Например, строковая константа “I am a string” будет представлена в памяти символьным массивом из 14 элементов (13 символов+’ ’). Рассмотрим два способа определения объектов программы, с помощью которых можно работать со строками: char amessage[] = “I am a string” ; /* массив */ char *pmessage = “I am a string” ; /* указатель */ В первом случае amessage – это массив, занимающий 14 байтов памяти, заполненных символами из строковой константы и каждый символ в этом массиве можно изменять. При этом переменная amessage всегда будет указывать на один и тот же участок памяти и её значение изменить нельзя. Во втором случае pmessage – указатель размером 4 байта. С его помощью можно также получить доступ к любому символу строковой константы, но изменять символы нельзя. Кроме того, переменная pmessage в дальнейшем может получить другое значение, например, в результате присваивания: pmessage = “I am another string” ; Лекция 04. 10. 11 г. 2
Обработка строк При выполнении различных преобразований над строками необходимо очень внимательно подходить к учёту разницы между представлением строк массивами и указателями. Рассмотрим известную задачу «обмен значениями» для двух строк. #include
Обработка строк Модифицируем программу – в основной программе будем использовать указатели: #include
Обработка строк Основная причина неудачи предыдущей программы – попытка изменить символы в строковой константе (это невозможно!). Однако в этом случае есть более лёгкое решение – строки оставить на месте, а поменять значения указателей: #include
Обработка строк В этот раз неудача объясняется тем, что значения указателей s 1 и s 2 в функции изменять нельзя по той же причине, которая была рассмотрена ранее в теме «два способа передачи аргументов в функцию» . Выход – использование адресов указателей s 1 и s 2 (т. е. указателей на указатели): #include
Иллюстрация к программе main #include
Массивы указателей Так как указатели являются обычными переменными, их можно хранить в массиве. Создадим объект «массив строк» , проинициализируем его и выполним перестановку некоторых элементов этого массива: #include
Иллюстрация к программе arrs → arrs[0] first arrs[1] arrs → arrs[0] first second arrs[1] second arrs[2] third arrs[3] fourth arrs[4] fifth Лекция 04. 10. 11 г. 9
Многомерные массивы Синтаксис языка С допускает, чтобы при определении массива его элементами были массивы (одинакового размера!). В этом случае приходим к понятию многомерного прямоугольного массива. Например, популярный математический объект «матрица» может быть представлен двумерным массивом: #include
Многомерные массивы Можно задать двумерный массив неопределенного (по первому измерению!) размера : #include
Многомерные массивы и указатели По аналогии с одномерными массивами можно предположить, что справедливо соотношение: x[i][j] эквивалентно *(*(x+i)+j). Проверим это: #include
Многомерные массивы нерегулярной структуры С помощью указателей можно сконструировать необычные, «зубчатые» массивы, в которых каждая строка может иметь свой размер, например так: 1 2 5 3 4 3 8 5 7 9 #include
Динамические многомерные массивы Используя указатели и динамическое выделение памяти сконструируем зубчатый массив специального вида - нижнюю треугольную матрицу размера n (n вводится с клавиатуры), заполненную числовыми значениями по следующему правилу: 1 2 1 3 2 1 4 3 2 1 5 4 3 2 1 6 5 4 3 2 1 7 6 5 4 3 2 1 8 7 6 5 4 3 2 1 9 8 7 6 5 4 3 2 Лекция 04. 10. 11 г. 1 14
Динамические многомерные массивы #include