
- •Лексемы
- •Идентификаторы
- •Константы
- •Операции
- •Знаки пунктуации
- •Основные типы данных.
- •Описание переменных
- •Оператор присваивания
- •Примеры программ
- •Форматированный ввод, вывод
- •Особенности ввода, вывода символов
- •Функции gets, puts, atoi, atol и atof
- •Занятие 2. Операторы выбора.
- •Выражения, операции
- •Логические операции
- •Условная операция
- •Условный оператор
- •Оператор перехода goto
- •Оператор выбора switch
- •Оператор цикла с предусловием (while)
- •Оператор цикла с постусловием (do - while)
- •Оператор цикла for
- •Примеры использования операторо цикла
- •Занятие 3. Указатели. Ссылки. Массивы. Работа со строками.
- •Указатели
- •Операции разыменования и взятия адреса
- •Инициализация указателей
- •Арифметические операции с указателями
- •Присваивание указателей
- •Сравнение указателей
- •Операция new
- •Операция delete
- •Примеры использования указателей
- •Одномерные массивы
- •Инициализация одномерных массивов
- •Примеры работы с одномерными массивами
- •Многомерные массивы
- •Занятие 4. Указатели и массивы.
- •Указатели и одномерные массивы
- •Размещение одномерных массивов в динамической памяти.
- •Массивы указателей
- •Занятие 5. Указатели и многомерные массивы.
- •Двухмерный массив и вспомогательный массив указателей
- •Список рекомендуемой литературы.
Присваивание указателей
Можно присваивать один указатель другому. Однако эта операция имеет смысл только в том случае, если оба указателя являются указателями на объекты одного и того же типа.
Пример присваивания указателей.
#include <stdio.h>
int main()
{
int j =12525, *p1, *p2;
p1=&j;
p2=p1; // Присваивание указателей
printf(“%d\n”, *p1); // Оба оператора напечатают одно и то же
printf(“%d\n”, *p2);
return 0;
}
Сравнение указателей
Можно сравнивать два указателя, если они указывают на один и тот же объект. Если же они указывают на разные объекты, то их можно проверить только на несовпадение.
Пример сравнения на неравенство указателей.
#include <stdio.h>
int main()
{
int a,b;
int *p1, *p2;
p1=&a;
p2=&b; // Указатели p1 и p2 не равны, так как они указывают на
// разные объекты
if (p1 != p2) printf (“Указатели p1 и p2 не равны \n”);
else printf(“Эта строка не напечатается \n”);
return 0;
}
Операция new
Условно можно разделить всю память на 2 вида: автоматически распределяемую при работе программы (например, при объявлении переменной int a[10]; автоматически выделяется 10 ячеек памяти, каждая из которых предназначена для хранения целого значения) и свободную или динамически распределяемую. Доступ к ячейкам свободной памяти осуществляется посредством указателя, хранящего адрес нужной ячейки. Для выделения памяти в области динамического распределения используется ключевое слово new. Формат для выделения переменной
new имя_ типа;
Например, new int; выделит два байта памяти, а new long; четыре байта. В качестве результата оператор new возвращает адрес выделенного фрагмента памяти. Этот адрес должен присваиваться указателю.
Примеры.
unsigned short int *ps;
ps = new unsigned short int;
Теперь ps указывает на ячейку памяти, достаточную для хранения значения типа unsigned short int, и туда можно занести какое-нибудь значение: *ps = 72;
float *pa;
Операция delete
Когда память, выделенная под переменную, больше не нужна, ее следует освободить. Делается это с помощью оператора delete:
delete имя_указателя;
Примеры.
delete ps;
Повторное применение оператора delete к тому же самому указателю приведет к зависанию программы. Рекомендуется при освобождении памяти присваивать связанному с ней указателю нулевое значение. Повторный вызов оператора delete для нулевого указателя пройдет безболезненно для программы, например,
char *pc;
pc = new char;
*pc = 'a';
delete pc;
pc = NULL;
delete pc;
При освобождении памяти с самим указателем ничего не происходит и его можно снова использовать, присвоив ему новый адрес.
При невнимательной работе с указателями может возникнуть эффект утечки памяти. Это происходит, если указателю присваивается новое значение, а память, на которую он ссылался, не освобождается. Каждый раз, когда в программе используется оператор new, за ним должен следовать оператор delete.
Пример утечки памяти.
int *pi = new int; // Выделение памяти для хранения переменной типа int
*pi=72; // В выделенную память записывается значение 72
pi = new int; // Выделение новой области памяти
*pi =84; // Запись в новую область значения 84
После выполнения этих операторов память, содержащая значение 72, оказывается недоступной, поскольку указателю на эту область было присвоено новое значение. В результате невозможно ни использовать, ни освободить зарезервированную память до завершения программы (когда вся выделенная память освобождается автоматически).
Пример выделения, использования и освобождения динамической памяти.
#include <stdio.h>
int main()
{
int a=5;
int * pa = &a;
int *pheap = new int; // Выделение памяти под целую переменную
*pheap = 7;
printf(“a=%d, *pa =%d, *pheap=%d \n”, a, *pa, *pheap);
delete pheap; // Освобождение памяти, выделенной оператором new
pheap =pa; // Присвоение указателю нового значения
printf(“ *pheap=%d \n”, *pheap);
return 0;
}