Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Двойной указатель

2.5K
13 октября 2003 года
emergenter
16 / / 13.10.2003
Кто подскажет как на С++ реализовать что-нибудь чтобы было похоже что это двойной указатель!! Смысл его я понимаю а как это будет выглядеть???
3
13 октября 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by emergenter
Кто подскажет как на С++ реализовать что-нибудь чтобы было похоже что это двойной указатель!! Смысл его я понимаю а как это будет выглядеть???



А что за двойной указатель?
Я чего-то смысла не понимаю...

2.5K
13 октября 2003 года
emergenter
16 / / 13.10.2003
Я разобрался!! Это указатель на указатель!
435
14 октября 2003 года
avatara
188 / / 07.07.2003
Цитата:
Originally posted by emergenter
Я разобрался!! Это указатель на указатель!



Да это так. Такое можно, например, использовать для работы с многомерными массимами. Как частный случай для работы со строками:

#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;
}

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог