1.4. операторы динамического распределения памяти
Для выделения и освобождения памяти в Си++ можно применять новые унарные операции – 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<<"Входные данные: Первая строка "<<p; cout<<" Вторая "<<q; cout<<" Выходные данные: "; cout<<"Результат конкатенации первой и второй строки "; cout<<conc(p,q)<<" "; //результат конкатенации p и q - //"abc1234" cout<<"Результат конкатенации первой второй и снова первой строк "; cout<<conc(conc(p,q),p)<<" "; //результат конкатенации (p и q) //и p - "abc1234abc" getch(); //ожидание нажатия клавиши }
Реультаты работы программы представлены на рис. 1.1.
Подпрограмма conc() учитывает, что размер строки, полученной после объединения двух строк, равен сумме размеров этих строк. Здесь функция strlen() - стандартная и возвращает количество первых символов строки, не равных 0. Длина строки, вместе с завершающим ее нулем, равна strlen()+1. В данном примере сначала переписываются символы первой строки в результирующую строку res, а затем символы второй строки. В конце строки добавляется 0. Возвращается указатель на результирующую строку res. Замечание. В рассмотренном примере вывод производится с помощью операции cout<<данные. Аналогичным образом в Си++ можно осуществлять ввод: cin>>данные. Например, вместо операторов:
Scanf(“\%d”,&x); printf(“ x=\%d”,x);
для переменной x целого типа, можно написать:
cin>>x; cout<<” ”<<x;
указав в начале программы #include <iostream.h>. Отметим, что ввод с помощью cin отличается тем, что не требуется символ &.
|
| Оглавление| |