Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Gygocopter
10 / 10 / 5
Регистрация: 05.02.2014
Сообщений: 124
#1

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

07.09.2014, 16:54. Просмотров 212. Ответов 4
Метки нет (Все метки)

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 );
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.09.2014, 16:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатели на объекты в массиве (C++):

Указатели на объекты - C++
Здравствуйте! Есть класс, назовем его Some. Он содержит указатель на объект класса Other в качестве одной из переменных (свойств). В...

Указатели на объекты - C++
имеется класс Users и массив указателей на класс Users* userq у класса Users есть метод charsheet() и свойство Я вызываю...

Указатели на объекты - C++
В книге Шилдта, есть фрагмент кода: TwoDShape *shapes; shapes = &amp;Triangle(&quot;pryamougolni&quot;,8.0,12.0); shapes =...

Указатели на константные объекты - C++
Нельзя создать неконстантный указатель на константный объект по понятным причинам, но имеем такой код: typedef char* pStr; int...

Указатели на объекты класса - C++
Здравствуйте. помогите новичку. есть проблема с освоением программирования на VC++. пытаюсь скомпилировать вот этот пример из книги: ...

Создать указатели и ссылки на объекты в памяти - C++
Помогите, кто может Создайте в свободной памяти три объекта различных типов (Cat, Worker, Pencil…). Замените указатели ссылками и...

4
zss
Модератор
Эксперт С++
6578 / 6140 / 2022
Регистрация: 18.12.2011
Сообщений: 15,999
Завершенные тесты: 1
07.09.2014, 17:17 #2
person* p; - адрес места, где хранятся данные.

person** pp; - адрес места, где лежит указатель на данные (указатель на указатель).
Передавать его нужно в случае, когда Вы собираетесь менять этот указатель.
Что и происходит в Вашем примере.
Вместо того, чтобы переставлять данные,
Вы переставляете указатели на эти данные.
1
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.09.2014, 17:21 #3
Цитата Сообщение от Gygocopter Посмотреть сообщение
ведь передаем указатель на указатель **
C++
1
void order ( person** pp1, person** pp2 )
В параметрах и стоят указатели на указатель. В чём вопрос?
1
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**? Это имеется ввиду?
0
alsav22
5428 / 4823 / 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***? Что в параметрах, то и передаётся. В чём вопрос?
1
07.09.2014, 17:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.09.2014, 17:58
Привет! Вот еще темы с ответами:

Реализуйте алгоритм сортировки для массива, содержащего указатели на объекты-множества целых чисел - C++
Помогите сделать лабу, Я даже не знаю с чего начинать. Пользователь вводит в программу текст произвольной длины, завершая ввод...

Указатели в массиве - C++
В книжке нет описания к данному коду и мне немного не понятно в некоторых моментах: 1). while (*p) { (не понятно какое условие понимается...

Указатели в двумерном массиве - C++
Например есть массив int** mas=new int*; for(int i=0; i&lt;=str;i++) mas=new int; for (int i=0; i&lt;str; i++ ) for (...

Указатели в массиве на сортировку - C++
Доброго,времени,прошу помочь переделать данный код под указатели. #include &lt;iostream&gt; #include &lt;ctime&gt; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.