- •Обзорные лекции по курсу
- •Int Temp[12] - {2, 4, 7, } ;
- •Int main ()
- •Разыменование указателей
- •Int main()
- •Void *ptr;
- •Int main ()
- •Int main ()
- •Int main ()
- •Void *malloc(size_t size);
- •Void *calloc( size_t num, size_t size );
- •Void free(void *block);
- •Int main(void)
- •Int* pRegion;
- •Void newHandler()
- •Int main()
- •Int main ()
- •Int strcmp(const char* strl, const char* str2)
- •Int stricmp(const char* strl, const char* str2)
- •Int strncmp(const char* strl,
- •Int strnicmp(const char* strl,
- •Void *malloc(size_t size);
- •Void *calloc( size_t num, size_t size );
- •Void free(void *block);
- •Int main(void)
- •Int* pRegion;
- •Int main ()
- •Упражнения для самопроверки
Void newHandler()
{
cout « "\nHeдостаточно памяти!\n";
}
Int main()
{
int* ptr;
set_new_handler(newHandler);
ptr = new int[100];
for(int i=0; i<100; i++)
*(ptr+i) = 100-i;
for(int i=0; i<100; i++)
cout « *(ptr+i) « " ";
delete[] ptr;
long double* 1ptr;
if(Iptr = new long double[999999])
{
cout « "\nГотово!";
delete[] 1ptr;
} else
cout « "\nНеудача...";
return 0;
}
В начале представленной программы подключается уже знакомый заголовочный файл iostream.h для использования операций ввода/вывода, а также файл new.h для определения обработчика ошибок set_new_handler. Функция newHandler(). реализованная в начале программы, является собственно обработчиком ошибок выделения памяти. Она подключается в строке set_new_handler(newHandler);
заменяя тем самым стандартную процедуру обработки. Теперь всякий раз, когда программе будет необходимо выделить некоторую область динамической памяти, но в силу аппаратных или программных ограничений осуществить это будет невозможно, на экране будет появляться надпись:
"Недостаточно памяти!".
В главной функции программы следует объявление целочисленного указателя ptr, которому тут же оператором new присваивается адрес выделенного блока динамической памяти для 100 значений типа int. Далее область памяти заполняется в цикле числами от 100 до 1, а в следующем цикле осуществляется вывод ее содержимого, после чего выделенный блок динамической памяти освобождается (оператор delete []). Следующий шаг - попытка выделения памяти для большого массива типа long double. Если результат операции new[] нe нулевой, указателю 1ptr будет присвоено значение адреса зарезервированной памяти с выводом надписи " Готово!" и последующим высвобождением области. В случае неудачного выделения выводится сообщение " Неудача.. .".
Массивы символов в C++
В стандарт С++ включена поддержка нескольких наборов символов. Традиционный 8-битовый набор символов называется "узкими" символами. Кроме того, включена поддержка 16-битовых символов, которые называются "широкими". Для каждого из этих наборов символов в библиотеке имеется своя совокупность функций.
Как и в ANSI С, для представления символьных строк в С++ не существует специального строкового типа. Вместо этого строки в С++ представляются как массивы элементов типа char, заканчивающиеся терминатором строки - символом с нулевым значением ('\0'). Строки. заканчивающиеся нуль-терминатором, часто называют ASCIIZ-строками. Символьные строки состоят из набора символьных констант, заключенного в двойные кавычки:
"Это строка символов..."
В таблице 4.1 приведен набор констант, применяющихся в C++ в качестве символов.
Таблица 4.1. Классификация символов
прописная буква |
от 'А' до 'Z',от 'А' до 'Я' |
строчная буква |
от 'а1 до 'z',от 'а' до 'я' |
цифра |
от ' 0' до ' 9 ' |
пустое место |
горизонтальная табуляция ' \9 ' . перевод строки (код ASCII 1 0), вертикальная табу ляция (код ASCII 11), перевод формы код ASCII 12), возврат каретки (код ASCII 13) |
символы пунктуации |
!"#$%&' ()*+,-./:;<=>?@[\]^_{|}~ |
управляющий символ |
все символы с колами от 0 до 1Fh включительно и символ с кодом 7Fh |
пробел |
символ пробела (код ASCII 32) |
шестнадцатеричная цифра |
от '0' до '9', от 'А' до 'F', от 'а' до 'f ' |
При объявлении строкового массива необходимо принимать во внимание наличие терминатора в конце строки, отводя тем самым под строку на один байт больше:
// Объявление строки размером 10 символов,
// включая терминатор. Реальный размер
// строки: 9 символов + 1 терминатор
char buffer[10];
Строковый массив может при объявлении инициализироваться начальным значением. При этом компилятор автоматически вычисляет размер будущей строки в добавляет в конец нуль-терминатор:
// Объявление и инициализация строки:
char Wednesday[] = "Среда";
// что равносильно:
char Wednesday[]=
{'С','р','е','д','а','\0'};
В качестве оператора ввода при работе со строками вместо оператора записи в поток » лучше использовать функцию getline (), так как потоковый оператор ввода игнорирует вводимые пробелы, а кроме того, может продолжить ввод элементов за пределами массива, если под строку отводится меньше места, чем вводится символов. Функция getline() принимает два параметра: первый аргумент указывает на строку, в которую осуществляется ввод, а второй - число символов, подлежащих вводу.
Рассмотрим пример объявления символьных строк и использования функции ввода getline ().
#include <iostream.h>