Для выделения и освобождения памяти в Си++ можно применять новые унарные операции – new и delete, соответствующие функциям malloc и free в Си.
Формат операций:
· new TYPE Выделяет область памяти для переменной типа TYPE и возвращает его адрес.
· new TYPE (значение) Действует как предшествующая операция и инициализирует область памяти начальным значением.
· new TYPE [n] Выделяет область памяти для массива из n элементов и возвращяет его адрес.
· delete p Освобождает область памяти, на которую ссылается указатель p.
· delete []p Освобождает область памяти, занятую массивом, на который ссылается указатель p.
Пример. Приведём подпрограмму конкатенации строк, возвращающую адрес строки, полученной объединением двух строк.
// peregr.cpp
#include <iostream.h> //библиотека ввода-вывода
#include <conio.h> //консольный ввод-вывод
#include <string.h> //библиотека функций для работы со строками
char* conc(char* s, char* t)
{
int i;
char *res=new char[strlen(s)+strlen(t)+1]; //результирующая строка
for (i=0; i<strlen(s); i++)
res[i]=s[i]; //копируем в результат сначала
//первую строку
for (i=strlen(s); i<strlen(s)+strlen(t); i++)
res[i]=t[i-strlen(s)]; //а затем вторую
res[i]=0; //строка должна завершаться нулём
return res;
}
void main()
{
char* p="abc",*q="1234"; //объявим две строки p и q
clrscr();
cout<<"Входные данные:nПервая строка "<<p;
cout<<"nВторая "<<q;
cout<<"nnВыходные данные:n";
cout<<"Результат конкатенации первой и второй строки ";
cout<<conc(p,q)<<"n"; //результат конкатенации p и q -
//"abc1234"
cout<<"Результат конкатенации первой второй и снова первой строк ";
cout<<conc(conc(p,q),p)<<"n"; //результат конкатенации (p и q)
//и p — "abc1234abc"
getch(); //ожидание нажатия клавиши
}
Реультаты работы программы представлены на рис. 1.1.
Подпрограмма conc() учитывает, что размер строки, полученной после объединения двух строк, равен сумме размеров этих строк. Здесь функция strlen() - стандартная и возвращает количество первых символов строки, не равных 0. Длина строки, вместе с завершающим ее нулем, равна strlen()+1. В данном примере сначала переписываются символы первой строки в результирующую строку res, а затем символы второй строки. В конце строки добавляется 0. Возвращается указатель на результирующую строку res.
Замечание. В рассмотренном примере вывод производится с помощью операции cout<<данные. Аналогичным образом в Си++ можно осуществлять ввод: cin>>данные. Например, вместо операторов:
Scanf(“%d”,&x); printf(“nx=%d”,x);
для переменной x целого типа, можно написать:
cin>>x; cout<<”n”<<x;
указав в начале программы #include <iostream.h>. Отметим, что ввод с помощью cin отличается тем, что не требуется символ &.