Двойной указатель
Кто подскажет как на С++ реализовать что-нибудь чтобы было похоже что это двойной указатель!! Смысл его я понимаю а как это будет выглядеть???
А что за двойной указатель?
Я чего-то смысла не понимаю...
Я разобрался!! Это указатель на указатель!
Да это так. Такое можно, например, использовать для работы с многомерными массимами. Как частный случай для работы со строками:
#include <iostream.h>
#include <string.h>
// Набор констант, представляющих различные пункты меню
// Непроинициализированная константа имеет значение, на единицу большее предыдущей
enum {ChoiceAddEnd=1, ChoiceInsert, ChoiceDelete, ChoiceDeleteAll, ChoicePrint, ChoiceQuit};
int Menu(); // Вывод меню
char** AddLine(char**, int&); // Добавление строки в конец массива
char** InsLine(char**, int&); // Вставка строки в массив
char** DelLine(char**, int&); // Удаление указанной строки из массива
void DelAllLines(char**, int&); // Удаление всех строк массива
void Print(char**, int); // Распечатка строк массива
bool IsArrayEmpty(int&); // Проверка на наличие строк в массиве
void main()
{
char **c; // Массив строк
int m = 0; // Начальное количество строк массива
int choice = ChoiceAddEnd;
while (choice != ChoiceQuit) // Пока не выбран пункт ВЫХОД
{
choice = Menu(); // Вывод меню
cin.ignore(1); // Очистка потока ввода
switch (choice) // Выбор пункта меню
{
case ChoiceAddEnd:
c = AddLine(c, m); // Добавление строки в конец массива
break;
case ChoiceInsert:
c = InsLine(c, m); // Вставка строки в массив
break;
case ChoiceDelete:
if (!IsArrayEmpty(m)) // Если массив не пуст
c = DelLine(c, m); // Удаление строки
break;
case ChoiceDeleteAll:
if (!IsArrayEmpty(m)) // Если массив не пуст
DelAllLines(c, m); // Удаление всех строк массива
break;
case ChoicePrint:
if (!IsArrayEmpty(m)) // Если массив не пуст
Print(c, m); // Распечатка массива
break;
case ChoiceQuit:
break;
default: // В остальных случаях
cout << "Error in choice!\n";
break;
}
}
}
char** AddLine(char **c, int &m)
// Добавление строки в конец массива
{
char str[256]; // Массив для ввода новой строки
int n; // Длина введенной строки
int i;
cout << "Input string: ";
cin.getline(str, 256); // Ввод строки
n = strlen(str); // Вычисление длины новой строки
if (m == 0) // Если массив строк пуст
{
m++;
c = new char*[m];
c[0] = new char[n + 1]; // Создаем новую строку в массиве строк
strcpy(c[0], str);
return c;
}
else
{
m++;
char** t = new char*[m];// Новый массив строк
for(i = 0; i < m - 1; i++)
{
t = c;
}
t[m - 1] = new char[n + 1];
strcpy(t[m - 1], str); // Копирование новой строки
delete [] c;
return t; // Возврат нового адреса массива строк }
}
}
char** InsLine(char **c, int &m)
// Вставка строки в массив
{
char str[256]; // Массив для ввода новой строки
int n; // Длина введенной строки
int k; // Позиция новой строки в массиве
int i, j = 0;
cout << "Input string: ";
cin.getline(str, 256);
cout << "Input position # (0-" << m << "): ";
cin >> k;
while(k < 0 || k > m) // Проверка на ошибочный ввод
{
cout << "Error !!!\nInput position # (0-" << m << "): ";
cin >> k;
}
n = strlen(str); // Длина новой строки
if (m == 0) // Если массив строк пуст
{
m++;
c = new char*[m];
c[0] = new char[n + 1]; // Создаем новую строку в массиве строк
strcpy(c[0], str);
return c; // Возврат нового адреса массива строк
}
else
{
m++;
char** t = new char*[m];// Новый массив строк
for(i = 0; i < m; i++)
{
if (i == k)
{
t = new char[n + 1];
strcpy(t, str);
j = 1;
}
else
{
t = c[i - j];
}
}
delete [] c; // Удаление массива строк
return t; // Возврат нового адреса массива строк
}
}
char** DelLine(char **c, int &m)
// Удаление указанной строки из массива
{
int k; // Индекс удаляемой строки
int i, j = 0;
cout << "Input position # (0-" << m - 1 << "): ";
cin >> k;
while(k < 0 || k >= m) // Проверка на ошибочный ввод
{
cout << "Error !!!\nInput deleting position #: ";
cin >> k;
}
m--;
char** t = new char*[m];// Создание нового массива строк
for(i = 0; i < m; i++)
{
if (i == k)
j = 1;
t = c[i + j];
}
delete [] c; // Удаление массива строк
return t; // Возврат нового адреса массива строк
}
void DelAllLines(char **c, int &m)
// Удаление всех строк массива
{
for(int i = 0; i < m; i++)
delete [] c;
delete [] c; // Удаление всех строк массива
m = 0;
}
bool IsArrayEmpty(int &m)
// Возвращает истину, если массив строк пуст; в обратном случае - ложь
{
if (m == 0)
{
cout << "Your line array is empty.\n";
return true;
}
else
return false;
}
int Menu()
// Вывод меню
{
int choice;
cout << "\n******* Menu *******\n";
cout << "1-Add 2-Insert 3-Delete 4-Delete All 5-Print 6-Quit\n";
cin >> choice; // Выбор пункта меню
if(choice < 0 || choice > 6) // Проверка выбора
choice = 0;
return choice; // Возвращение выбранного пункта
}
void Print(char **c, int m)
// Распечатка массива строк
{
for(int i = 0; i < m; i++)
cout << i << ": " << c << endl;
}