
- •1.Операции с адресами
- •2.Переменная указатель
- •3.Операции над переменными указателями
- •4.Указатели и массивы
- •5.Описание функции
- •11.Варианты описания и использования функций. Аргументом функции является двухмерный массив (матрица).
- •12.Варианты описания и использования функций. Аргументом функции является другая функция.
- •Void f1(тип (*агтс)(тип1б тип2б…)б…)
- •13.Динамическая память «куча». Функции выделения и освобождения памяти.
- •14.Символьные строки. Определение, отличие от последовательности символов.
- •15.Объявления строковых данных (перечислить способы). Задание строки в форме строковой константы.
- •21.Основные функции для работы со строками.
- •22.Обязательная последовательность действий при работе с файлами. Описание файловой переменной.
- •23.Открытие файла.
- •24.Чтение данных из файла
- •25.Запись данных в файл
- •26.Закрытие файла. Необходимость выполнения этого действия.
- •27.Дополнительные функции работы с файлом.
- •28.Локальные и глобальные переменные.
1.Операции с адресами
Существует две адресные операции:
получение адреса переменной. производится с помощью &. Возвращает адрес младшего байта.
получение значения по заданному адресу P с помощью операции *P. P – указатель или адресное выражение.
Действие операции:
расчитывается адресное выражение
в памяти отыскивается байт с полученным адресом
из этого байта извлекается хранимое там значение
Количество байт, из которых извлекаются данные определяются типом значения, на которое показывает адресный указатель P.
2.Переменная указатель
Указатель – специальный вид переменной, которая предназначается для хранения адресов других переменных.
Запись: тип *имя;
Независимо от типа переменной - указателя, она всегда занимает 2 байта.
3.Операции над переменными указателями
Арифметические операции над переменными указателями
Увеличение значения указателя на единицу(P++) приводит к прибавлению количества байт, занимаемых переменной, на которую указывает данный указатель (соответствует типу).
4.Указатели и массивы
В языке Си имя массива – это указатель-константа на первый элемент массива.
При этом для двухмерного массива запись его имени с одним индексом задаёт адрес начала соответствующей строки.
Зная адрес массива можно определить адрес любого его элемента, производя арифметические операции с его указателями.
К элементам массива обращаемся, используя адресные выражения:
для одномерного массива A[i] == *(pta+i)
для двумерного массива A[i][j] == *(pta+i*n+j), где n – количество столбцов массива.
Функция – это часть программы, которая описывает выполнение заданного набора действий.
Любая программа на языке Си содержит хотя - бы одну функцию – main.
Виды функций:
Стандратная – это готовые к использованию функции (scanf, sin, cos … ). Размещаются в заголовочных файлах при помощи директивы #include (подключение файла). Для использования функции её нужно вызвать, указав её имя и в круглых скобках указав её параметры.
Пользовательские – новые функции, разработанные программистом.
Для использования необходимо:
Описать функцию
Вызвать функцию, задав её конкретные параметры.
5.Описание функции
тип имя(тип1 арг.1, тип2 арг.2, тип3 арг.3,…) //заголовок функции
{ описание1; //описание
…
Описание М; //описание внутренних переменных
Оператор1; //выполняемая часть
…
Оператор N; }
В качестве типа функции используют любой стандартный тип или специальный тип void. Если тип не указан, то поумолчанию – int
В круглых скобках – список формальных параметров. Тип – тип передаваемого параметра. Арг. – имя этого параметра.
Функция може быть описана:
ДО функции main()
void func(…) {…}
void main (…) {вызов func(); }
ПОСЛЕ функции main()
void func(тип1, тип2, тип3*) //прототип функции
void main(…) { вызов func(); }
void func(…) { … }
Тип функции, её имя, количество и типы аргументов должны соответствовать прототипу.
6.Варианты вызова функции.
При вызове функции ей передаются конкретные значения, называемые фактическими параметрами.
Количество и тип передаваемых значений должны соответствовать списку формальных параметров.
Формы вызова:
Если функция имеет тип void, то её вызов – самостоятельный оператор: имя(факт_арг1, факт_арг2,…)
Функция имеет определённый тип(не void). Вызов не является самостоятельным оператором, а записывается внутри другого оператора: u=имя(факт_арг1, факт_арг2,…);
7.Механизм передачи параметров в функцию и обратно
Для передачи параметра используется специальная область динамической памяти, которая называется СТЭК.
В стэк данные записываются по правилу LIFO(Last Input First Output)
При передаче данных в стэк записывается копия передаваемого параметра.
Void func(int arg1, int arg2, int *arg3) { *arg3=arg1 + arg2; }
8.Варианты описания и использования функций. Функция возвращает результат через своё имя.
1)При описании функция должна иметь определённый тип.
2)В теле функции обязательно должен присутствовать оператор return
3) Вызов функции не является самостоятельным оператором, а осуществляется внутри другого оператора.
Функция должна иметь тип возвращаемого значения.
9.Варианты описания и использования функций. Функция возвращает одно или несколько значений через аргументы.
1) Функция должна иметь тип void
2) Значения, возвращаемые через аргументы, должны быть описаны в списке формальных параметров как указатели на возвращаемый тип. void func(int k, float *ptf, float t)
3) Вызов функции является самомтсоятельным операторм.
При этом в качестве фактического параметра возвращаемого значения передаются адреса переменных (&ptf).
10.Варианты описания и использования функций. Аргументом функции является одномерный массив.
Одномерный массив в качестве аргумента функции можно передать 3-я способами:
Массив с фиксированным количеством элементов.
В теле функции к элементам массива обращаются привычным способом: имя массива[индекс]
При вызове функции в качестве фактического параметра передаётся имя массива. Способ нерационалный, так как не позволяет обрабатывать массив большего размера.
Массив с неопределённым количеством элементов.
В этом случае надо передавать еще один аргумент, который равен количеству элементов массива. void func(float a[ ], int n)
В теле функции к элементу массива обращаются привычным способом.
Массив описывается как указатель на начало массива.
В этом случае необходимо обязательно передавать количество элементов. void func(float *pta, int n)
Внутри функции к элементам массива можно обращаться двумя способами:
*(pta+i) == a[i]
pta[i]
При вызове такой функции передаётся адрес нулевого элемента массива func(&t[0],200);