Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Итоговый конспект Тельнов.docx
Скачиваний:
10
Добавлен:
07.04.2023
Размер:
7.75 Mб
Скачать

17. Язык Си: ссылочные типы. Пример.

Ссылочные типы

Можно одному и тому же объекту давать несколько имен.

Наиболее часто ссылочные типы используются для передачи аргументов

“по ссылке”, при этом указатели явным образом не применяются.

Примеры:

int a = 1; //если b = 3, то значение a также станет равным 3

int &b = a; //b есть синоним (второе имя) переменной a

struct point { float x, y; }; //декартовы координаты точки на плоскости

void cartezian1 ( struct point* p, float r, float f ) //из полярных координат в декартовы

{ p->x = r * cos ( f ); p->y = r * sin ( f ); }

//или можно так:

{ (*p).x = r * cos ( f ); ( *p ).y = r * sin ( f ); }

//второй вариант - использует ссылочный тип и значения по умолчанию

void cartezian2 ( point& d, float r = 1., float f = 0.)

{ d.x = r * cos(f); d.y = r * sin ( f ); }

//обращение к функциям:

point z; //описана структурная переменная

cartezian1 ( &z, 1., 0. ); //без ссылочных типов, используем указатель

cartezian2 ( z ); //используем ссылочный тип, работаем с оригиналом аргумента

18. Язык Си: защита указателей и объектов, неявное изменение объектов.

Защита указателей и объектов

Ключевое слово const при описании объекта указывает на то, что значение данного объекта не может изменяться.

Пример:

const pi = 3.14; //это константа(используется вместо директива #define

const char* ps; //указатель на постоянный объект

const char s[5] = “abcd”; //постоянный массив символов

ps = s; //так можно

*( ps + 1 ) = “x”; //так нельзя, объект защищен от изменений

char* const ps = s; //постоянный указатель на объект

ps = “dcba”; //так нельзя, указатель защищен от изменения

*(ps + 2) = “z”; //так можно, защищен указатель на объект, а не сам объект

const char* const ps = s; //постоянный указатель на постоянный объект

//защита аргументов функции от изменения:

char* strcpy ( char* to, const char* from );

19. Язык Си: организация ввода/вывода. Пример: слияние файлов. Организация ввода/вывода

В Си нет операторов ввода/вывода. Это делает ядро языка независимым от аппаратуры компьютера. Операции ввода и вывода реализуются путем обращения к библиотечным функциям.

Вообще, стандартная библиотека Си есть собрание общеупотребительных и полезных функций. Они хранятся в библиотеке в откомпилированном виде, готовые к использованию. Чтобы компилятор мог контролировать правильность обращения к библиотечным функциям, в заголовочных файлах даны их прототипы.

Стандартная библиотека Си условно состоит из двух частей:

Под файлом (в узком смысле) будем понимать поименованную область долговременной

памяти компьютера.

Слово «файл» также употребляют, когда говорят о потоке данных, связанном с устройством ввода/вывода: клавиатурой, монитором, принтером, модемом, др.

Есть функции ввода/вывода высокого и низкого уровня.

Ввод/вывод высокого уровня унифицирован и использует абстракцию «поток».

Потоки имеют уникальные имена, когда они связаны с реальными устройствами.

В Си это достигается использованием так называемых указателей на файл.

В действительности указатель на файл есть указатель на структуру следующего вида:

typedef struct {

char *_ptr; // указатель на текущий байт в буфере ввода/вывода

int _cnt; // счетчик байтов в буфере ввода/вывода

char *base; // адрес буфера ввода/вывода

char _flag; // флаги доступа

char _fd; // дескриптор файла (для ввода/вывода низкого уровня)

} FILE;

В системе всегда имеется массив структур типа FILE:

extern FILE _iob [20]; // можно иметь открытыми до 20 файлов

К вашим услугам всегда есть несколько стандартных потоков ввода/вывода:

extern FILE *stdin; // стандартный поток ввода

extern FILE *stdout; // стандартный поток вывода

extern FILE *stderr; // для сообщений об ошибках (не буферизован)

extern FILE *stdaux; // резервный поток (не буферизован)

extern FILE *stdprn; // стандартный поток для печати

Эти потоки всегда открыты, их можно направлять на разные устройства.

Все прочие потоки нужно явным образом создавать (открывать файлы).