- •1.Алгоритм. Основные свойства алгоритмов. Описание алгоритмов
- •2. Понятие о структурном программировании
- •3. Структура программы на языке c. Синтаксис и семантика. Лексемы
- •4. Порядок выполнения программ на языке c
- •5. Тип данных как совокупность значений и действий. Внутреннее представление чисел в эвм. Простые типы языка c
- •6. Операции и выражения в языке c
- •7. Приоритеты операций в языке c
- •8. Элементарный ввод-вывод в языке c. Спецификации преобразования
- •9. Условный операторы.
- •10. Вложенные условные операторы
- •11. Оператор switch
- •12. Оператор цикла while
- •13. Оператор цикла do-while
- •14. Оператор цикла for
- •15. Вложенные циклы
- •16. Одномерный массив.
- •17. Двумерные массивы
- •18. Типовые действия с массивами
- •19. Сортировка элементов одномерного массива
- •20. Указатель. Адресная арифметика
- •21. Операции над указателями
- •22. Связь одномерных массивов с указателями
- •23. Связь двумерных массивов с указателями
- •24. Массивы указателей !!!!!
- •25. Строки символов
- •26. Использование указателей для адресации строк символов
- •27. Функции. Объявление и описание
- •28. Функции без аргументов. Функции с аргументами. Оператор return
- •29. Использование указателей в качестве параметров функций
- •31. Причины появления ошибок в программах
- •32. Тесты. Отладка программ
- •33. Проверка программ «вручную». Анализ программ
- •34. Проверка программ «вручную». Прокрутка
20. Указатель. Адресная арифметика
Указатель – это переменная, в которой хранится адрес другой переменной или участка па-
мяти.
Указатели объявляются в списке переменных, но
перед их именем ставится знак *. Указатель всегда
указывает на переменную того типа, для которого
он был объявлен.
f = *pF;
Такая запись означает: «записать в переменную f
то вещественное число, на которое указывает указа-
тель pF». Запись *pF обозначает содержимое ячей-
ки, на которую указывает pF.
Указатели часто используют при динамическом выделении памяти. Для того чтобы воспользоваться функциями динамической работы с памятью нужно включить заголовочный файл ALLOC.H:
#include <alloc.h>
а вот пример динамического выделения памяти:
int *p1;
p1 = (int*)malloc( sizeof(int) );
21. Операции над указателями
присваивание
операция сравнения, сложения, вычитания.
Можно сравнивать указатели одинакового типа. Важной особенностью арифметических операций с указателями является то, что физическое увеличение или уменьшение значения указателя зависит от его типа.(*p++ увеличится на 4)
22. Связь одномерных массивов с указателями
Имя массива является указателем константой, равной адресу начала массива. Доступ к элементам массива можно организовать с помощью указателя.
23. Связь двумерных массивов с указателями
Имя двумерного массива является указателем константой на массив указателей констант.
Элементами массива указателей являются указатели константы на начало каждой из строк массива.
С элементами двумерного массива можно работать с помощью индексов а можно использовать механизм указателей. В посл случае точкой отсчета может служить первый элемент строки в котором находится исконный элемент так и первый элемент двумерго массива
Между указателями и массивами существует определенная связь. Предположим, имеется массив из 100 целых чисел. Запишем двумя способами программу суммирования элементов этого массива:
long array[100];
long sum = 0;
for (int i = 0; i < 100; i++)
sum += array[i];
То же самое можно сделать с помощью указателей:
long array[100];
long sum = 0;
for (long* ptr = &array[0];
ptr < &array[99] + 1; ptr++)
sum += *ptr;
24. Массивы указателей !!!!!
Так как указатели сами являются переменными, то вы вполне могли бы ожидать использования массива указателей. Это действительно так. Мы нуждаемся в таком представлении данных, которое бы позволяло удобно и эффективно обрабатывать строки текста переменной длины.
Здесь и возникают массивы указателей. Если подлежащие сортировке сроки хранятся одна за другой в длинном символьном массиве (управляемом, например, функцией ALLOC), то к
каждой строке можно обратиться с помощью указателя на ее первый символ. Сами указатели можно хранить в массиве.
Альтернатива:
Операции с указателями
Над указателями можно выполнять унарные операции: инкремент и декремент. При выполнении операций ++ и -- значение указателя увеличивается или уменьшается на длину типа, на который ссылается используемый указатель.
Пример:
int *ptr, a[10];
ptr=&a[5];
ptr++; /* равно адресу элемента a[6] */
ptr--; /* равно адресу элемента a[5] */
В бинарных операциях сложения и вычитания могут участвовать указатель и величина типа int. При этом результатом операции будет указатель на исходный тип, а его значение будет на указанное число элементов больше или меньше исходного.
Пример:
int *ptr1, *ptr2, a[10];
int i=2;
ptr1=a+(i+4); /* равно адресу элемента a[6] */
ptr2=ptr1-i; /* равно адресу элемента a[4] */
В операции вычитания могут участвовать два указателя на один и тот же тип. Результат такой операции имеет тип int и равен числу элементов исходного типа между уменьшаемым и вычитаемым, причем если первый адрес младше, то результат имеет отрицательное значение.
Пример:
int *ptr1, *ptr2, a[10];
int i;
ptr1=a+4;
ptr2=a+9;
i=ptr1-ptr2; /* равно 5 */
i=ptr2-ptr1; /* равно -5 */
Значения двух указателей на одинаковые типы можно сравнивать в операциях ==, !=, <, <=, >, >= при этом значения указателей рассматриваются просто как целые числа, а результат сравнения равен 0 (ложь) или 1 (истина).
Пример:
int *ptr1, *ptr2, a[10];
ptr1=a+5;
ptr2=a+7;
if (prt1>ptr2) a[3]=4;
В данном примере значение ptr1 меньше значения ptr2 и поэтому оператор a[3]=4 не будет выполнен.