- •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,Последовательный и прямой доступ в поток.
32.Массивы указателей. Указатели на указатели.
Элементами массива могут быть и указатели. Имя массива – это указатель на его первый элемент, поэтому имя массива указателей- это указатель на указатели.
Можно описать и переменную, являющуюся указателем на указатели. Признаком такого объявления является число повторения символов *. Число * показывает уровень указателя. Фактически, указатель на указатель- это ячейка памяти, содержащая адрес указателя. Размер области памяти, выделяемый под эту переменную равен 2-4Б. При объявлении указатель на указатель можно инициализировать.
Пр: int data =5; //переменная целого типа
int *ptr=&data; //указатель на объект целого типа
int **ptr1=&ptr; //указатель на указатель
int ***ptr2=&ptr1; //указатель на указатель
Для доступа к соответствующим элементам можно использовать и индексы
Пр: int a[]={11,12,13,14,15};
int *p[]={a,a+1,a+2,a+3,a+4};
int **pp=p;
33.Массивы указателей на строки.
Объявление:
char *mes[]={“Не открыт файл”,”Ошибка ввода”,”Диск”,”Пауза”};
При таком объявлении стринговые константы будут занесены в раздел констант памяти. Компилятор резервирует место для 4-х указателей, которые получают начальные значения, равные адресу памяти соответствующих стринговых констант. Существует различие размещения в памяти массива указателей и подобного ему двумерного массива:
char arr[][16]={“Не открыт файл”,”Ошибка ввода”,”Диск”,”Пауза”};
При компиляции программы, содержащей объявления mes и arr, их внутреннее представление в памяти будет иметь следующий вид:
4*2+39*1=47(байт) для mes и 4*8*2=64(байта) для arr
Преимущество использования массива указателей на строки состоит в том, что предоставляется возможность выполнения операций не с самими строками, а с их адресами. Объекты, с которыми работает программа, находятся в динамической памяти.
34.1,Передача параметров из операционной среды.
Иногда возникает необходимость передавать в программу информацию при её вызове. Основной метод состоит в использовании аргументов командной строки операционной системы. В этом случае функция main() должна быть определена с параметром или аргументом. Первые два параметра:
argc ( argument count )
argv ( argument vector )
Параметр argc определяет количество аргументов командной строки и является параметром типа int. Он всегда не меньше 1, так как имя программы, вызываемой для выполнения, трактуется как первый параметр.
Параметр argv является массивом указателей, каждый элемент которого ссылается на строковое представление аргумента командной строки, передаваемого функцией main(). Функции main() может пердаваться третий параметр envp, который также является массивом указателей на строковые величины, определяющие операционную систему.
main(int argc,char *argv[],char *envp[]) или main(int argc,char **argv,char **envp)
argv[0] всегда содержит имя вызываемой программы, поэтому значение argc на 1 превышает количество передаваемых параметров. Остальные аргументы массива argv указывает на аргументы командной строки, разделяемых пробелами или табуляциями. Если аргументом является число, то оно рассматривается как строка символов.
#include <stdio.h>
#include <stdlib.h>
main(int argc, char *argv[])
{if (argc<2 ) {printf(“Вы забыли набрать имя\n”);exit(0);}
pintf(“Hello!%s!\n”, argv[1]);}
Если ввести: >name.exe Василий
то получим Hello!Василий!
Общая длина строки, на которую указывает элемент argv или envp, не должна превышать 128 символов.