С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,607
1

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

17.10.2018, 20:59. Показов 1668. Ответов 25
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!
Задался теоретическим вопросом. Читал пример из книги Лафоре ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ
ПРОГРАММИРОВАНИЕ В C++, код persort.cpp// сортировка объектов через массив указателей на них. Рассматривается массив указателей на объекты. Автор пишет, что быстрее рассортировать в массиве сами указатели через указатели на них, потому что
"Таким образом мы исключаем необходимость перемещения объектов в памяти, которое отнимает много времени, если объекты очень большие" . То есть идёт работа с указателями на указатели. Я не понимаю, почему нельзя просто менять
значения адресов, которые хранятся в указателях, одно значение записывать в один указатель, а его первоначальное
значение- в другой. Ключевым ведь является то, что если я поменяю в указателе значение - адрес объекта, это же не значит
что тот объект, на который данный указатель указывал, переместиться на этот этот новый адрес
(как процитировано выше), правильно ? Или я чего-то не понимаю? Код из книги ниже, но зачем же усложнять указателями на указатели?


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
#include <iostream>
#include <string>                 //for string class
using namespace std;             
 
class person                      //class of persons
   {
   protected:
      string name;                //person's name
   public:
      void setName()              //set the name
         { cout << "Enter name: "; cin >> name; }
      void printName()            //display the name
         { cout << endl << name; }
      string getName()            //return the name
         { return name; }
   };
 
int main()
   {
   void bsort(person**, int);     //prototype
   person* persPtr[100];          //array of pointers to persons
   int n = 0;                     //number of persons in array
   char choice;                   //input char
          
   do {                           //put persons in array
      persPtr[n] = new person;    //make new object
      persPtr[n]->setName();      //set person's name
      n++;                        //count new person
      cout << "Enter another (y/n)? "; //enter another
      cin >> choice;              //   person?
      }
   while( choice=='y' );          //quit on 'n'
 
   cout << "\nUnsorted list:";
   for(int j=0; j<n; j++)         //print unsorted list
      { persPtr[j]->printName(); }     
 
   bsort(persPtr, n);             //sort pointers
 
   cout << "\nSorted list:";
   for(j=0; j<n; j++)             //print sorted list
      { persPtr[j]->printName(); }
   cout << endl;
   return 0;
   }  //end main()
 
void bsort(person** pp, int n)    //sort pointers to persons
   {                              
   void order(person**, person**);  //prototype
   int j, k;                      //indexes to array
 
   for(j=0; j<n-1; j++)           //outer loop
      for(k=j+1; k<n; k++)        //inner loop starts at outer
          order(pp+j, pp+k);       //order the pointer contents
   }
 
void order(person** pp1, person** pp2)  //orders two pointers
   {                              //if 1st larger than 2nd,
   if( (*pp1)->getName() > (*pp2)->getName() )
      {
      person* tempptr = *pp1;     //swap the pointers
      *pp1 = *pp2;
      *pp2 = tempptr;
      }
   }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.10.2018, 20:59
Ответы с готовыми решениями:

Массивы указателей и указатели на указатели
В чем разница между массивами указателей и указателями на указатели? Может, между ними такая же...

Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов?
Есть массив int **mas; mas=new int*; // выделил место под пять строк, верно ? mas=new int;//...

Указатели, почему выводится строка вместо символа?
Понемногу мозги закипают, сижу разбираюсь с указателями, вот наваял пример, но в моем понимании, на...

Указатели и указатели на указатели, а также типы данных
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно....

25
Неэпический
18109 / 10696 / 2062
Регистрация: 27.09.2012
Сообщений: 26,939
Записей в блоге: 1
19.10.2018, 11:24 21
Author24 — интернет-сервис помощи студентам
XLAT, тогда так void func()
0
Just Do It!
4028 / 2422 / 640
Регистрация: 23.09.2014
Сообщений: 7,806
Записей в блоге: 2
19.10.2018, 11:41 22
Цитата Сообщение от _stanislav Посмотреть сообщение
нет такого типа данных!
батенька, вы злоупотребляете абстракцией, если же её в меру, то есть)

Цитата Сообщение от Croessmah Посмотреть сообщение
тогда так void func()
говорят процедурная парадигма устарела,
жду от вас кульминационную демонстрацию без func()
должно получиться девственно чисто)
0
Неэпический
18109 / 10696 / 2062
Регистрация: 27.09.2012
Сообщений: 26,939
Записей в блоге: 1
19.10.2018, 11:42 23
Цитата Сообщение от XLAT Посмотреть сообщение
жду от вас кульминационную демонстрацию без func()
вот void
1
Just Do It!
4028 / 2422 / 640
Регистрация: 23.09.2014
Сообщений: 7,806
Записей в блоге: 2
19.10.2018, 12:05 24
Цитата Сообщение от Croessmah Посмотреть сообщение
вот void
спасибо за оправданное ожидание))
пусть это даже не скомпилируется.

Не по теме:


из своего опыта:
странный опыт, но часто бывает так, что если я из своего кода выкидываю функцию, то код начинает работать лучше)

0
4019 / 2565 / 430
Регистрация: 09.09.2017
Сообщений: 11,442
19.10.2018, 13:39 25
Цитата Сообщение от Croessmah Посмотреть сообщение
Во-первых, такая запись сама по себе воспринимается сложнее.
В-третьих, слабо верится, что разработчику функции нужна эта подсказка
Но, согласитесь, дополнительную информацию она дает. "на вход ожидается готовый массив указателей".
Цитата Сообщение от Croessmah Посмотреть сообщение
Во-вторых, такая запись всё равно не дает никаких гарантий.
Форматирование кода тоже не дает никаких гарантий. Так что же, писать все в одну строчку?
Цитата Сообщение от _stanislav Посмотреть сообщение
нет такого типа данных!
Тип данных - указатель на "что-то размером sizeof(void*)" байт (для адресной арифметики размер адресуемого все же важен).
Цитата Сообщение от XLAT Посмотреть сообщение
жду от вас кульминационную демонстрацию без func()
{}
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,884
Записей в блоге: 1
19.10.2018, 18:42 26
Цитата Сообщение от XLAT Посмотреть сообщение
говорят процедурная парадигма устарела
парадигма как ручка, как инструмент, решения какой то конкретной задачи, что устарело, задача или инструмент?

Добавлено через 45 секунд
Цитата Сообщение от XLAT Посмотреть сообщение
батенька, вы злоупотребляете абстракцией, если же её в меру, то есть)
да, я пошутил.
0
19.10.2018, 18:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.10.2018, 18:42
Помогаю со студенческими работами здесь

Указатели. Важность указателей
Здарова! Я хорошо понимаю (относительно хорошо, конечно), что такое указатели. Я слышал, что...

Указатели. Вычитание указателей
Сам читаю книгу Шилдта. Глава с указателями, написано - &quot;Если складывать указатели нельзя, то...

Инициализация массива указателей на указатели
Всем привет. Есть такой код: char **pchAr = new char*; //в цикле по i pchAr = new char; ...

Указатели. Сравнение двух указателей и их sizeof()
Есть код: int main() { int x = 10; int y = 10; int *xptr = &amp;x; int *yptr = &amp;y;...


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru