- •Подготовка программы к исполнению
- •Директива препроцессора #include
- •Математические функции из библиотеки cmath
- •Заголовок функции main
- •Объявление переменных.
- •Объявление переменных простого типа
- •Объявление констант простого типа
- •Перечисляемые переменные.
- •Логические операции
- •Операторы
- •Операторы сложные
- •Составной оператор
- •Структурированные операторы
- •Условный оператор.
- •Блок-схема оператора разветвления
- •Условная операция.
- •Операция «запятая» в операторе if.
- •Преобразование и привидение типов.
- •Оператор выбора варианта.
- •Блок-схема оператора варианта
- •Цикл по счётчику
- •Цикл c предусловием.
- •Цикл c постусловием.
- •Операторы передачи управления
- •1) Спецификации формата, которые определяются символом % - для выделения, контроля и преобразования соответствующих им введенных значений;
- •2) Любые символы, которые могут быть во входном потоке и которые надо игнорировать:
- •2) Первого символа, который не соответствует формату (например, буква или пробел после выделения числа); .
- •3) Заданной длины поля вводимого значения, если она определена в формате.
- •4.2.2. Форматы вывода данных
- •1) Спецификации формата, которые определяются символом % - для вывода .Значений, определенных списком аргументов, если они есть;
- •2) Любые символы, которые должны быть выведены в выходной поток;
- •2 Позиции отводятся для знака числа и точки.
- •Составные типы данных
- •Обработка двумерного массива
- •Указатели
- •Порядок выполнения операций над указателями
- •Арифметические операции над адресами
- •Операторы распределения памяти new и delete
- •Указатели и динамические массивы
- •Указатели и спецификатор const
- •Массивы указателей
- •Организация динамического двумерного массива
- •Функции работы со строками
- •Действия, производимые над строками и их правила Присвоение
- •Конкатенация строк
- •Копирование строк
- •Определяет длину строки
- •Указатели и строки
- •Введение в класс string
- •Структуры
- •Ссылочные переменные
- •Функции
- •Функции, имеющие возвращаемый параметр с помощью оператора return.
- •Объявление формальных параметров
- •Ввод - вывод записей
- •Дополнительные возможности работы с файлами
- •Работы с файлами и стандартный класс mfc cFileDialog.
- •Работа с файлами с помощью mfc( классы cFile, cStdioFile, ... ) и стандартный класс mfc cFileDialog.
- •Класс cFile
- •Класс cMemFile
- •Класс cStdioFile
- •Примеры записи и чтения из файла
Указатели и динамические массивы
Динамические массивы создаются во время выполнения программы. По ходу выполнения неоднократно может определяться размер массива, резервироваться память, обрабатываться и освобождаться.
Формат оператора new для динамического массива:
Тип указатель = new тип [размер];
Формат оператора delete для освобождения памяти занятой динамическим массивом:
delete [] указатель;
Размер в операторе new записывается в квадратных скобках и задает число элементов создаваемого массива. В результате выполнения оператора указатель получает адрес нулевого элемента. Следовательно, адрес каждого элемента находится указатель + индоксная, а значение по адресу хранящемуся в указателю, т.е.:
- * указатель + индоксная;
- *указатель[индоксная];
- указатель[индоксная];
В операторе delete размер не указывается, но наличие квадратных скобок является обязательным. Оператор освобождает память от всех элементов массива, а указатель теряет адрес нулевого элемента.
Пример использования операторов new и delete для динамического массива
#include <iostream>
using namespace std ;
int main ( )
{
// ввод размера массивов
int size ; cout << "Enter size of array -> " ; cin >> size ;
// выделение памяти под массивы
double* pdArray = new double [ size ] ;
int* piArray = new int [ size ] ;
// адреса элементов массивов
cout << "\nAddresses for double\n" ;
for ( int i = 0; i < size; i++ )
cout << ( pdArray + i ) << '\t' ;
cout << "\n\nAddresses for int\n" ;
for ( int i = 0; i < size; i++ )
cout << ( piArray + i ) << '\t' ;
// значения элементов массива целых чисел
cout << "\n\nValues of integer array\n" ;
for ( int i = 0; i < size; i++ )
{
* ( piArray + i ) = i * i ; //piArray[i]
cout << * ( piArray + i ) << "\t\t" ;
}
cout << endl ;
// освобождение памяти
delete [ ] piArray ; delete [ ] pdArray ;
return 0 ;
}
Указатели и спецификатор const
Если спецификатор const стоит перед именем типа, то объявляется указатель на константу.
Пример объявления указателя на константу
const char A = 'A' ;
const char* pC = &A ;
const char Z = 'Z' ; pC = &Z ;
Невозможно изменить значение переменной, на которую указывает указатель, но можно изменить значение самого указателя. Это полезно при передаче аргументов в функцию, когда аргументы нельзя изменить.
Если спецификатор const стоит непосредственно перед идентификатором указателя, то объявляется константный указатель.
Пример объявления константного указателя
char* const pCH = new char [ 40 ] ;
int * const pi = new int [100];
// константный указатель на константу
const char* const p = "constant pointer on a constant" ;
В этом случае, нельзя изменить значение указателя, но можно изменить значение того, на что он указывает. Указатели, которые объявлены константными, должны получить начальное значение при объявлении. Константный указатель всегда указывает на одну и ту же ячейку памяти.
Пример использования указателей со спецификатором const
// Пример указателей с модификатором const
#include <iostream>
using namespace std ;
int main ( )
{
// указатель на константу
cout << "Pointer on constant\n" ;
const char A = 'A' ; const char* pC = &A ;
cout << "I pointer " << &pC ;
cout << "\tmy constant " << *pC << endl ;
// указатель можно изменить
const char Z = 'Z' ; pC = &Z ;
cout << "And now\t\t\tmy constant " << *pC << endl ;
// константный указатель
cout << "\nThe constant pointer" ;
char* const pCP = new char [ 40 ] ;
char s1 [ ] = "As you brew," ;
char s2 [ ] = "so must you drink." ;
strcpy_s ( pCP, 40, s1 ) ;
cout << '\n' << &pCP << " point on ->\t" << pCP ;
// содержимое можно изменить
strcpy_s ( pCP, 40, s2 ) ;
cout << "\nAnd now I point on ->\t" << pCP << endl ;
// константный указатель на константу
const char* const p = "constant pointer on a constant" ;
// освобождение памяти
delete [ ] pCP ;
// ошибки
// *pC = 'Z' ; // *pC - символьная константа
// pCP = new char [ 20 ] ; // pCP - константный указатель
// p = new char [ 40 ] ; // p - константный указатель
// * ( p + 7 ) = 'T' ; // * ( p + 7 ) - константный символ
// delete pC ; // pC - не было new
// delete [ ] s1 ; // s1 - массив
return 0 ;
}