
- •4.Элементы языка Си. Символы, лексемы, знаки операций.
- •1.Символы языка
- •2.Лексемы
- •5.Элементы языка Си. Константы, идентификаторы, ключевые слова, комментарии.
- •6.Типы данных.
- •7.1,Объявление переменных. Массивы.
- •7.2,Объявление переменных. Массивы.
- •9.1,Операции и выражения. Арифметические операции
- •11. Логические операции и операции отношения. Операции присваивания
- •12.Условное выражение. Операция Sizeof. Операции приведения типов type.
- •13.1,Преобразование типов в выражения. Правила приведения типов.
- •13.2,Преобразование типов в выражения. Правила приведения типов.
- •14.1, Управление вычислительными процессами. Конструкции if-else, else-if.
- •14.2, Управление вычислительными процессами. Конструкции if-else, else-if.
- •15.Переключатель
- •16. Операторы цикла.
- •17.1.Инструкции break, continue. Инструкция goto и метки. Пустой оператор
- •17.2.Инструкции break, continue. Инструкция goto и метки. Пустой оператор
- •Пустой оператор
- •18.1.Классы памяти.
- •18.2.Классы памяти.
- •19.1. Функции. Определение ф-ций.
- •Определение ф-ции
- •19.2. Функции. Определение ф-ций.
- •21. Структура программы на языке Си
- •22. Директивы #define и # undef.
- •24,Директивы препроцессора. Препроцессорные операции.
- •Препроцессорные операции
- •25.1, Указатели.Операции &,*.
- •25.2, Указатели.Операции &,*.
- •26. Указатель на неопределенный тип.
- •27.1,Выражения и операции с указателями. Присваивание указателей
- •Сравнение указателей
- •27.2,Выражения и операции с указателями. Применение арифметических операций к указателям
- •29. Массивы и указатели.
- •30.Операции с указателями на массив. Адресная арифметика.
- •32.Массивы указателей. Указатели на указатели.
- •33.Массивы указателей на строки.
- •34.1,Передача параметров из операционной среды.
- •34.2,Передача параметров из операционной среды.
- •36.1,Динамичное распределение памяти.
- •36.2,Динамичное распределение памяти.
- •37,1,Структуры. Операции над структурами
- •37,2,Структуры. Операции над структурами
- •38.Массив структур. Правило выравнивания структурных переменных в памяти
- •39.1,Переименование типов. Средство typedef.
- •39.2,Переименование типов. Средство typedef.
- •40.Поля битов.
- •41.1,Объединения
- •41.2,Объединения
- •42.Ввод, вывод потока.
- •43.Доступ к файлам через поток ввода/вывода.Открытие потока.Закрытие потока.
- •44.1,Доступ к файлам через поток ввода/вывода.Функция потокового ввода вывода.
- •44.2,Доступ к файлам через поток ввода/вывода.Функция потокового ввода вывода.
- •45,Последовательный и прямой доступ в поток.
26. Указатель на неопределенный тип.
Существует специальный тип указателя, к-рый наз указателем на неопределенный тип. Для объявления такого указателя используется ключевое слово void.
Void *идентефикатор
Объявление такого указателя позволяет “отстрочить” определение типа, на к-рый ссылается переменная. Указатель на тип void можно использовать для ссылки на объект любого типа, но к нему нельзя применить операцию * без предварительного приведения типов, т.к. компилятору неоходима информация о числе байтов, участвующих в операци.
Для использования такого указателя для доступа к объекту, к-рый он адресует, необходимо явно задать требуемый тип каждой операции с указателем.
27.1,Выражения и операции с указателями. Присваивание указателей
Можно присвоить один указатель другому. Эта операция имеет смысл только в том случае, если они адресуют объекты одного и того же типа.
#include <stdio.h>
main()
{int I , *ip1, *ip2;
I= 125
Ip1=&I;
Ip2=&ip1;
Printf(“%d\t%d\n”,*ip1,*ip2);
}
результат : 125 125
Сравнение указателей
Сравнение двух указателей используется чаще всего в том случае, если оба указателя адресуют объект общий для них
#include <stdio.h>
main()
{int a,b, *ip1, *ip2;
Ip1=&a;
Ip2=&b;
If (ip1!=ip2) printf(“указатели не равны”)
Else printf(“эта строка не напечатается”);
}
27.2,Выражения и операции с указателями. Применение арифметических операций к указателям
К указателям могут быть применены операции
++ , - - , + , - ,
Если ++ (- - ), то указатель увеличивается (уменьшается) на размер объекта, к-рый он адресует
Тип * ptr;
Ptr ++ = содержимое ptr + sizeof(тип);
Операции + и – тоже имеют свою специфику. Складывать и вычитать указатели можно с целым числом.
Недопустимы:
1)сложение двух указателей
2)вычитание двух указателей на разные объекты
3)вычитания из указателя числа с плавающей точкой
4)вычитание указателей
5)деление указателей
6)порозрядные операции и операции сдвига
7)указатель одного типа присвоить указателю другого типа, без приведения типов
29. Массивы и указатели.
Доступ к массиву можно осуществить двумя способами:
1)с помощью индексного выражения
2)в виде указателя со смещением
Элемент массива можно изобразить в виде указателя со смещением и в виде имени массива с указанием элемента. Эти две записи можно и сочетать. В общем случае индексное выражение имеет вид : выр1[выр2], где выр1 – это указатель, выр2 – целое число.
n-ый элемент массива может быть записан как : a[n], n[a], *(a+n), *(n+a), pa[n], n[pa], *(pa+n), *(n+pa)
30.Операции с указателями на массив. Адресная арифметика.
Если есть уверенность, что элементы массива существуют, то возможно индексирование в обратную сторону. Если два указателя р1 и р2 указывают на элементы одного и того же массива, то к ним применимы следующие операции :
p1++( - -) – устанавливает указатель на следующий(предыдущий) элемент массива
p1+n (p1-n)- устанавливает указатель на n-ый после(перед) элемент массива
p2 - p1 - дает число элементов массива между р1 и р2
p1= = p2 - дает результат 1,если р1 и р2 указывают на один элемент, иначе 0
p1 ! = p2 -дает результат 1,если р1 и р2 указывают на разные элементы, иначе 0
p1 > (> =) p2 - дает результат 1,если р1 указывает на элемент с большим (большим либо равным) индексом чем р2
p1 < (< =) p2 -дает результат 1,если р1 указывает на элемент с меньшим (меньшим либо равным) индексом чем р2
Любой указатель можно сравнивать с 0. Константу 0 можно присваивать указателю = NULL Для указателей, ссылающихся на элементы разных массивов, результат арифметических операций и операций сравнения неопределен.
Пр: длина строки
Int strlen (char *s)
{ char *p = s
while (*p!= ‘\0’)
p+ +;
return p-s;
}
Существует исключение: в арифметике с указателем можно использовать адрес несуществующих переменных массива, следующих за последним элементом