Форум программистов, компьютерный форум CyberForum.ru

Указатели на объекты в массиве - C++

Восстановить пароль Регистрация
 
Gygocopter
10 / 10 / 5
Регистрация: 05.02.2014
Сообщений: 124
07.09.2014, 16:54     Указатели на объекты в массиве #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <iostream>
#include <string>
using namespace std;
///////////////////////////////////////////////////////////
class person            // некоторый человек
{
  protected:
    string name;        // имя
  public:
    void setName ( )    // установка имени
      { cout << "Введите имя: " cin >> name; }
    void printName ( )  // показ имени
      { cout << endl << name; }
    string getName ( )  // получение имени
      { return name; }
};
///////////////////////////////////////////////////////////
int main ( )
{
  void bsort ( person**, int ); // прототип функции
  person* persPtr [ 100 ];      // массив указателей на person
  int n = 0;                    // количество элементов в массиве
  char choice;                  // переменная для ввода символа
 
  do
  {
    persPtr [ n ] = new person;       // создаем новый объект
    persPtr [ n ]->setName ( );       // вводим имя
    n++;                              // увеличиваем количество
    cout << "Продолжаем ввод (д/н)?"; // спрашиваем, закончен ли ввод
    cin >> choice;
  }
  while ( choice == 'д' );
 
  cout << "\nНеотсортированный список:";
  for ( int j = 0; j < n; j++ ) // покажем неотсортированный список
    persPtr [ j ]->printName ( );
 
  bsort ( persPtr, n );         // отсортируем указатели
 
  cout << "\nОтсортированный список:";
  for ( j = 0; j < n; j++ )     // покажем отсортированный список
    persPtr [ j ]->printName ( );
  cout << endl;
 
  return 0;
}
///////////////////////////////////////////////////////////
void bsort ( person** pp, int n )
{
  void order ( person**, person** ); // прототип функции
  int j, k;                          // переменные для циклов
 
  for ( j = 0; j < n – 1; j++ )      // внешний цикл
    for ( k = j + 1; k < n; k++ )    // внутренний цикл
      order ( pp + j, pp + k );      // сортируем два элемента
}
///////////////////////////////////////////////////////////
void order ( person** pp1, person** pp2 )
{
  if( (*pp1)->getName ( ) > (*pp2)->getName ( ) ) // если первая строка больше второй,
  {
    person* tempptr = *pp1; // меняем их местами
    *pp1 = *pp2;
    *pp2 = tempptr;
  }
}
Почему
C++
1
void order ( person** pp1, person** pp2 )
, а не
C++
1
void order ( person*** pp1, person*** pp2 )
, ведь передаем указатель на указатель **
C++
1
      order ( pp + j, pp + k );
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.09.2014, 16:54     Указатели на объекты в массиве
Посмотрите здесь:

C++ Указатели на объекты класса
C++ Указатели на объекты
C++ Указатели на объекты
Указатели в массиве C++
Указатели в строчном массиве C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1786
Регистрация: 18.12.2011
Сообщений: 14,196
Завершенные тесты: 1
07.09.2014, 17:17     Указатели на объекты в массиве #2
person* p; - адрес места, где хранятся данные.

person** pp; - адрес места, где лежит указатель на данные (указатель на указатель).
Передавать его нужно в случае, когда Вы собираетесь менять этот указатель.
Что и происходит в Вашем примере.
Вместо того, чтобы переставлять данные,
Вы переставляете указатели на эти данные.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.09.2014, 17:21     Указатели на объекты в массиве #3
Цитата Сообщение от Gygocopter Посмотреть сообщение
ведь передаем указатель на указатель **
C++
1
void order ( person** pp1, person** pp2 )
В параметрах и стоят указатели на указатель. В чём вопрос?
Gygocopter
10 / 10 / 5
Регистрация: 05.02.2014
Сообщений: 124
07.09.2014, 17:46  [ТС]     Указатели на объекты в массиве #4
zss, а если надо переставить данные, то как передавать?

alsav22,
в bsort передаем person*
C++
1
bsort ( persPtr, n );
а параметре указатель на указатель person**.
C++
1
void bsort ( person** pp, int n )
В order передаем person**
C++
1
void order ( person** pp1, person** pp2 )
и в параметрах person**, a не person***
Почему не сделать в bsort параметр person*? ошибка:
C++
1
3   IntelliSense: argument of type "person **" is incompatible with parameter of type "person *"
Я понимаю, что передаем указатель person*, его адрес может хранить person**.
Но получается, что адрес указателя personn**, хранить также person**, правильно? (потому что person** - это тоже указатель, а адрес указателя хранить указатель на указатель)

И еще, я правильно понимаю, что мы не можем в person*, поменять пестами адреса person[0] и person[2], например, для сортировки, то есть нам нужно для этого использовать person**? Это имеется ввиду?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.09.2014, 17:58     Указатели на объекты в массиве #5
Цитата Сообщение от Gygocopter Посмотреть сообщение
в bsort передаем person*
В bsort передаём persPtr - адрес массива указателей (имя массива в параметрах преобразуется к адресу первого элемента массива), т.е. адрес первого указателя в массиве (указатель на указатель).

Добавлено через 3 минуты
Цитата Сообщение от Gygocopter Посмотреть сообщение
В order передаем person**
C++
1
void order ( person** pp1, person** pp2 )
и в параметрах person**, a не person***
При чём здесь, вообще, person***? Что в параметрах, то и передаётся. В чём вопрос?
Yandex
Объявления
07.09.2014, 17:58     Указатели на объекты в массиве
Ответ Создать тему
Опции темы

Текущее время: 11:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru