- •Тело функции
- •Вопрос №2 Основные алгоритмические конструкции на псевдокодах
- •Вопрос №4 Числовые типы данных
- •Вопрос № 6. Символьные типы данных в языке си
- •Вопрос №7. Модификаторы типов в языке си.
- •Вопрос №8. Требования к идентификаторам на языке си
- •Буферизованный ввод/вывод.
- •Билет № 20. Модификаторы форматных команд в printf();
- •Билет №21. Синтаксис оператора вывода на языке си.
- •Билет №22. Синтаксис оператора выбора в языке си
- •If(условие)действие;
- •Билет №24. Синтаксис и использование оператора «if»
- •Билет №26. Виды и характеристики циклических структур на языке си
- •Билет №27. Синтаксис и использование оператора цикла “for”
- •Билет №37. Работа с массивами в языке си
- •Билет №40. Операции с указателями
Билет №40. Операции с указателями
Имеются два особых оператора, которые используются только с
указателями: * и &. Оператор & является унарным оператором и
возвращает адрес памяти операнда. Второй оператор для указателей, *,
в известной степени является дополнением (в смысле формальной
логики) оператора &. Он также является унарным оператором, и
возвращает значение, содержащееся в ячейке памяти, на которую
указывает значение переменной типа указатель. Оба оператора, * и &,
имеют самый высокий приоритет среди прочих арифметических
операторов, за исключением унарного минуса. Их приоритет равен
приоритету унарного минуса.
Билет №41. Присваивание значений указателям
Указателям можно присваивать значения с помощью оператора &.
Операция присваивания будет выглядеть следующим образом:
ptr_var = &var;
где адрес переменной var присваивается переменной ptr_var.
Выражения с использованием указателей следуют тем же правилам,
что и прочие выражения языка СИ. Очень важно, чтобы указателям
были присвоены значения перед их использованием; в противном
случае указатели будут содержать случайные значения («мусор»), и
невозможно предугадать, на какие ячейки памяти они при этом
будут ссылаться.
Билет №42. Арифметические операции с указателями
С указателями можно выполнять только две операции: сложение и
вычитание. Помимо операторов инкремента и декремента можно
выполнять сложение и вычитание целых чисел со значениями
указателей. Также запрещено сложение и вычитание чисел с
плавающей точкой (float и double) с указателями. Можно сравнивать
два указателя, включая их в выражение отношения (логическое
выражение). Но это возможно только в том случае, если оба указателя
ссылаются на переменные одного и того же типа.
Билет №43. Сравнение указателей
Билет №44. Указатели и одномерные массивы
Имя массива в действительности является указателем на первый
элемент этого массива. Адрес любого элемента массива может
быть отображен двумя способами:
- записью имени соответствующего элемента массива, которому
предшествует символ амперсанда (&);
- записью выражения, в котором значение индекса прибавляется к
имени массива.
Количество ячеек памяти, связанных с элементом массива будет
зависеть от типа данных, объявленного для этого массива, так же
как и от архитектуры используемого компьютера. Тем не менее,
программист может задать только лишь адрес первого элемента
массива, которой является именем этого массива и количество
элементов, следующих за первым, то есть, значение индекса.
Билет №45. Динамическое распределение памяти
В случае, когда массив объявлен обычным способом, за ним жестко
закрепляется некоторый участок памяти в начальной стадии
выполнения программы, в то время как для массива, представленного
указателем, фиксированный блок памяти не выделяется. Распределение
памяти по запросу во время работы программы, называется
динамическим распределением (выделением) памяти. В этом случае
память для хранения информации выделяется из общего резерва (пула)
свободной памяти, только в тех случаях, когда она необходима.
Билет №46. Синтаксис и использование функции free();
Функция free() используется для возвращения (освобождения) памяти,
после того, как работа с ней завершена и она больше не нужна.
Пример: исходный код программы:
int main()
{free(buffer1); //высвобождает блок памяти buffer1 }
Билет №47. Синтаксис и использование функции calloc();
Функция calloc() похожа на функцию malloc(), но главное ее отличие в
том, что выделяемая память заполняется нулями по умолчанию. При
использовании malloc() в выделяемой памяти находятся случайные
значения (часто называемые «мусором»). Для функции calloc() требуются
два аргумента. Первый аргумент – это количество переменных (элементов
данных), для которых выделяется память. Второй аргумент представляет
собой размер (в байтах) каждой переменной (каждого элемента). Так же
как malloc(), функция calloc() возвращает указатель типа void, если память
была выделена успешно, в противном случае она вернет null – значение.
int main()
{ int * buffer2 = (int*) calloc (100*sizeof(int)), // выделяет память под
} 100 элементов
Билет №48. Синтаксис и использование функции malloc();
Функция malloc() является одной из наиболее часто используемых функций,
которая дает получить блок из резерва свободной памяти. Параметром
функции является целое число, которое задает количество запрашиваемых
байтов.
int main()
{
int * buffer1 = (int*) malloc (100*sizeof(int)), // выделяет память под
} 100 элементов
Билет №49. Синтаксис и использование функции free();
Функция free() используется для возвращения (освобождения) памяти,
после того, как работа с ней завершена, и она больше не нужна.
int main()
{free(buffer1); //высвобождает блок памяти buffer1}
Билет №50. Синтаксис и использование функции realloc();
Функция realloc() позволяет выделить дополнительное число байтов
памяти. Функция имеет два аргумента. Первый является указателем на
используемую память, второй – размер (в байтах) блока памяти после
перераспределения памяти.
int main()
{int * buffer3 = (int*) realloc (buffer2, 500*sizeof(int)); // перераспределить
} память в блоке
