Аватар для Fatmarmelad
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,613

Почему в сортировке указателей на объекты в вызове функции используются адреса объектов, а не указателей?

27.03.2017, 20:38. Показов 865. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Рассматриваю пример (из Лафоре) сортировки массива указателей на объекты, для чего используются указатели на указатели. Всё понял, кроме одного момента

В строке 48
C++
1
order(pp + j, pp + k);
То есть, это уже адреса объектов. Почему там не стоят *pp+j,*pp+k?
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
#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 << "Продолжаем ввод (y/n)?"; // спрашиваем, закончен ли ввод
cin >> choice;
}
while(choice == 'y');
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;
}
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.03.2017, 20:38
Ответы с готовыми решениями:

Почему массив указателей на строки не указывает на адреса?
Почему в этом примере указатель типа char не указывает адрес, а хранит в себе строки? Пример: #include&lt;iostream&gt; using...

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей. Вернуть адрес...

Почему адреса у указателей разные, несмотря на то, что они указывают на одну и ту же переменную?
Почему адреса у указателей разные, они же указывают на одну и туже переменную int main() { setlocale(LC_ALL, &quot;Russian&quot;); ...

5
 Аватар для Nishen
1355 / 854 / 365
Регистрация: 26.02.2015
Сообщений: 3,809
27.03.2017, 20:52
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
C++
1
order(pp + j, pp + k);
Тут мы передаем в функцию order "адреса на адреса объектов". А в неё уже мы меняем местами адреса объектов.

Добавлено через 4 минуты
Можно переписать, например, так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
    }
}
Добавлено через 3 минуты
Просто в функции order вы обходите массив указателей на элементы класса Person. Если Вы напишите
C++
1
*pp+j
, то разыменуете указатель на указатель на объект класса (получится указатель на объект), и после этого увеличите значение. Получится белеберда.

Нужно сначала перейти на следующий элемент массива указателей, разыменовать его и передать в функцию. Либо же не разыменовывая передавать его в функцию order, которая сама этим займётся.

Надеюсь, я понятно объясняю.
0
 Аватар для Fatmarmelad
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,613
27.03.2017, 21:18  [ТС]
Nishen,
Я вот как понимаю. Если person** pp1 указатель на адрес указателя, то * pp1 адрес указателя объекта, а pp1 адрес объекта.
То есть ** pp1 - разыменовать указатель, * pp1 - разыменовать объект. Или это неправильно?
0
 Аватар для Nishen
1355 / 854 / 365
Регистрация: 26.02.2015
Сообщений: 3,809
27.03.2017, 21:24
Fatmarmelad, нет, **p1 - указатель на указатель, *p1 - указатель на объект, p1 - объект.

Иными словами, пусть у нас есть объект p1. Положим его по адресу 0x0001, к примеру (в 0х0001 лежит p1) - это будет *p1. Теперь значение указателя *p1 (0х0001) положим по адресу (0х0002) - это будет **p2.

Добавлено через 37 секунд
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
разыменовать объект.
Ну, и выражаться так не верно. Разыменовывают не объекты, а указатели.
0
 Аватар для Fatmarmelad
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,613
27.03.2017, 22:16  [ТС]
Nishen, а как можно разыменовать **p2?
0
 Аватар для Nishen
1355 / 854 / 365
Регистрация: 26.02.2015
Сообщений: 3,809
27.03.2017, 22:40
Дважды применить к указателю операцию разыменования.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.03.2017, 22:40
Помогаю со студенческими работами здесь

Список указателей на авторские объекты, я могу воспользоваться только первым его элементом. Почему?
Друзья! Короче создал ПРОСТОЙ класс всего с одним полем и функцией которая выводит значение этого поля. Создал массив из 2-х указателей на...

Виртуальные функции (создать массив указателей на объекты трех классов)
Задание: создать массив указателей на объекты трех классов. Метод Show почему-то не переопределяется. В данном коде вводится 3 элемента в...


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

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

Новые блоги и статьи
Звёздная пыль
kumehtar 20.06.2025
Я просто это себе представляю: как создавался этот мир. Как энергия слипалась в маленькие частички. Как они собирались в первые звёзды, как во вселенной впервые появился Свет. Как эти звёзды. . .
Создание нейросети с PyTorch
AI_Generated 19.06.2025
Ключевое преимущество PyTorch — его питоновская натура. В отличие от TensorFlow, который изначально был построен как статический вычислительный граф, PyTorch предлагает динамический подход. Это. . .
JWT аутентификация в ASP.NET Core
UnmanagedCoder 18.06.2025
Разрабатывая веб-приложения, я постоянно сталкиваюсь с дилеммой: как обеспечить надежную аутентификацию пользователей без ущерба для производительности и масштабируемости? Классические подходы на. . .
Краткий курс по С#
aaLeXAA 18.06.2025
Здесь вы найдете все необходимые функции чтоб написать програму на C# Задание 1: КЛАСС FORM 1 public partial class Form1 : Form { Spisok listin = new Spisok(); . . .
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
Angular: Вопросы и ответы на собеседовании
Reangularity 15.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru