Аватар для kcalbCube
15 / 13 / 4
Регистрация: 16.08.2018
Сообщений: 125

Указатели на указатели: для чего они могут понадобятся?

18.08.2018, 03:47. Показов 4504. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Изучаю C++, дошёл до указателей на указатели.
Там пишут что эта тема не обязательна.
Для чего они могут понадобятся?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.08.2018, 03:47
Ответы с готовыми решениями:

Для чего нужны указатели?
Кто может объяснить для чего нужны указатели и смысл их? в интернете одна муть и еще для чего нужно new delete

Для чего нужны указатели на функции?
для чего нужны эти указатели на функции... не проще ли вызвать саму функцию, чем заводить под нее указатель и им пользоваться...

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

47
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
20.08.2018, 06:13
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от kcalbCube Посмотреть сообщение
Для чего они могут понадобятся?
Рискну предположить, что в современном C++ - ни для чего. Но, поскольку, C++ - это не только приятный C++17, но и адская туча легаси-кода, с которым с очень высокой долей вероятности придётся столкнуться, знать эту тему всё равно надо.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.08.2018, 08:37
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
// prg_title в местах "не столь отдалённых" рыжее означает золота
//а слово и седина, это как известно, - серебро
//этот код не претендует не на то ни на другое
//это рыже-кодерство с проседью :-)
#include<iostream>
using namespace std;
//мудрый совет
//прежде чем что-то изобрести или пойти в "неизведанный лес"
//думайте по аналогии, это сэкономит кучу времени и болеутоляющего
//как для головы, так и для других важных органов
 
int maxOfArray(int * ar, int sz);
int maxOfArray(int **ar, int sz1, int sz2);
 
int main(int argv, char*argc[])
{
//пусть есть несколько независимых переменных
 
int a(0), b(1), c(2);
 
//нас интересует максимальное из них значение.
//это значит они нас интересуют как группа
 
//значит создаём групу имеющихся сущностей ////// запомните, - это важно - так как будет повторяться
 
int ar[] = {a, b, c};
 
int max_abc = maxOfArray(ar, 3);
cout<<"\nmax array "<< max_abc;
 
//теперь, пусть у нас есть три массива
 
int ar_a[]={21,31,41};
int ar_b[]={12,13,14};
int ar_c[]={20,30,40};
 
//задача та же - найти максимальное int в этом стоге интов
 
//но мы не можем создать группу - массив на этом же уровне косвенности без копирования всего.
//Это потому, что нельзя нарушать контракт массива - "последовательное размещение"
//наши массивы уже существуют и они поддерживают такой контракт, каждый внутри себя
//но между ними, обычно дыры и целый массив без копирования мы создать не можем
 
//значит создаём групу имеющихся сущностей
 
int *ar_ar[] = {ar_a, ar_b, ar_c};
 
max_abc = maxOfArray(ar_ar, 3, 3);
cout<<"\nmax array array " << max_abc;
 cin.get();
    return 0;
}
 
//это "заглушки" - реализуйте сами
int maxOfArray(int * ar, int sz)
{
    return ar[sz-1];
}
int maxOfArray(int **ar, int sz1, int sz2)
{
    return ar[sz1-1][sz2-1];
}
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
20.08.2018, 09:46
Цитата Сообщение от kcalbCube Посмотреть сообщение
Для чего они могут понадобятся?
Для того что бы передать в функцию пустой указатель и выделить память.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Function(int** p)
{
    *p = new int(5);
}
void Function(int* p)
{
    p = new int(5);
}
 
int main()
{
    int* p = nullptr;
 
    Function(p);    // Эта функция не работает
    Function(&p);   // А эта работает
 
    return 0;
}
Добавлено через 1 минуту
но лучше наверно делать так
C++
1
2
3
4
void Function(int*& p)
{
    p = new int(5);
}
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.08.2018, 10:41
Цитата Сообщение от _stanislav Посмотреть сообщение
Для того что бы передать в функцию пустой указатель и выделить память.
Ссылку на указатель передать удобнее.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void FunctionByRef(int*& p)
{
    *p = new int(5);
}
void Function(int* p)
{
    p = new int(5);
}
 
int main()
{
    int* p = nullptr;
 
    Function(p);    // Эта функция не работает
    FunctionByRef(p);   // А эта работает
 
    return 0;
}
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
20.08.2018, 11:15
Цитата Сообщение от IGPIGP Посмотреть сообщение
Ссылку на указатель передать удобнее.
так я вроде как упомянул об этом
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.08.2018, 11:38
Цитата Сообщение от _stanislav Посмотреть сообщение
так я вроде как упомянул об этом
Я не дочитал.

Не по теме:

Вопрос сформулирован несколько рыхло в том смысле, что слово "могут" (понадобиться) не даёт представления о том, зачем они нужны. Это потому, что в С++ можно найти много вариантов того, что не нужно делать прибегая ко многим вариантам. То есть, в таком широком топике имеет смысл показать примеры, где без указателя на указатель обойтись трудно. Двумерные массивы - самое простое. Отличие в том, что нельзя создать массив ссылок (на указатели), тогда как передать ссылку на указатель в функцию, - можно. Это принципиальная вещь.

0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
20.08.2018, 13:00
Цитата Сообщение от Новичок Посмотреть сообщение
1) В С++ есть вектора(используя которые можно вообще не думать о выделении памяти), велосипедить свою матрицу на указателях смысла нет(разве только в образовательных целях)
Надеюсь, ты не имеешь в виду матрицу вида "вектор векторов"?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
20.08.2018, 13:36
New man, "вектор векторов" - это наилучший вариант для матрицы с динамическим изменением размеров.

Добавлено через 58 секунд
Для матриц с заранее известным размером он конечно не подходит - слишком медленно выделяется и удаляется.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.08.2018, 14:48
Цитата Сообщение от TRam_ Посмотреть сообщение
Для матриц с заранее известным размером он конечно не подходит - слишком медленно выделяется и удаляется.
TRam_, я в это не верю. Вектор можно выделить в компайл тайме и плоха та библиотека и тот компилятор который это делает через стра... страшную стратегию выделения в режиме свободного роста.
0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
20.08.2018, 21:13
TRam_, что-то не вижу преимуществ.
При добавлении элемента в каждый вектор-строку, будет реаллокация + memcpy, при добавлении в вектор векторов будет реаллокация и n вызовов move конструктора.

+ куча кэш-промахов, так как каждая строка независимо куда-то указывает.

У матрицы одним куском (примеры для row-major):
1) добавление строки — один new[] и один memcpy (экономия n-1 new[] и n-1 memcpy)
2) добавление столбца — один new[] и n memcpy (экономия n-1 new[])

Можно вспомнить умение вектора увеличиваться вдвое (из-за чего с увеличением размера время между аллокациями экспоненциально растёт), но это можно и в таком векторе сделать с помощью выделения памяти размером capacity_hor*capacity_vert.

На больших матрицах в некоторых задачах ещё может быть эффективным хранение матрицы как набора маленьких сплошных матриц, за счёт чего "близкие" элементы матрицы находятся рядом в памяти.

А для некоторых матриц вообще эффективнее будет хранить map с ключом в виде пары индексов и значением в виде ненулевого элемента.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.08.2018, 13:26
Цитата Сообщение от New man Посмотреть сообщение
TRam_, что-то не вижу преимуществ.
При добавлении элемента в каждый вектор-строку, будет реаллокация + memcpy, при добавлении в вектор векторов будет реаллокация и n вызовов move конструктора.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Вектор можно выделить в компайл тайме
если вам не нужны преимущества динамического выделения, то Вы можете спокойно отказаться от его недостатков, выделив заблаговременно столько сколько нужно. То, что это надо знать на стадии написания кода не аргумент, так как массив тоже должен быть определён в размерах на этот момент (нестандартные расширения не рассматриваем).
0
Одессит
 Аватар для kylroma
243 / 88 / 44
Регистрация: 30.12.2013
Сообщений: 316
Записей в блоге: 2
21.08.2018, 16:04
Имхо, указатели на указатели - это почти всегда быдлокод без которого можно обойтись.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
21.08.2018, 16:09
Цитата Сообщение от kylroma Посмотреть сообщение
Имхо, указатели на указатели - это почти всегда быдлокод без которого можно обойтись.
А часто бывает наоборот.
1
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
21.08.2018, 17:13
Ну например взять передачу указателя на указатель на функцию класса. Его можно преобразовывать в void *, а указатель на функцию класса - нельзя.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.08.2018, 19:59
Цитата Сообщение от kylroma Посмотреть сообщение
Имхо, указатели на указатели - это почти всегда быдлокод без которого можно обойтись.
Тут о другом речь:
Цитата Сообщение от kcalbCube Посмотреть сообщение
Изучаю C++, дошёл до указателей на указатели.
TRam_, указатели на функции, это про не то.
Цитата Сообщение от TRam_ Посмотреть сообщение
а указатель на функцию класса - нельзя.
Можно ещё и так спросить. А указатели на extern "C" функции? Почему - нет?
А почему, - да?

Не по теме:

Нар-р-ёд! Чё молчим? Может кто ещё про указатели знает? Указатель на указатель - особенно приветствуется.

0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
21.08.2018, 20:01
Цитата Сообщение от IGPIGP Посмотреть сообщение
А указатели на extern "C" функции?
По идеи нельзя.
void * - указатель на данные, а не на функции.
Например, POSIX требует совместимости, но стандарт C++ этого не требует.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
21.08.2018, 20:03
Цитата Сообщение от IGPIGP Посмотреть сообщение
А указатели на extern "C" функции?
А их возможно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
void DoFunction(void *p_f)
{
    (*reinterpret_cast<void (*)()>(p_f))();
}
 
 
void DoSomething()
{
    std::cout << "Hello, world!";
}
 
int main()
{
    DoFunction(reinterpret_cast<void *>(&DoSomething));
}
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
21.08.2018, 20:04
del
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.08.2018, 20:04
Синхронный del.
0
21.08.2018, 20:04

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
Нар-р-ёд! Чё молчим? Может кто ещё про указатели знает? Указатель на указатель - особенно приветствуется.
холиварчик раздуть решил? :)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.08.2018, 20:04

Ссылки и указатели, для чего нужны те и другие?
Что такое ссылки? Что такое указатели? ДЛЯ чего служат те и другие?

Понимание для чего вообще нужны указатели?
Сейчас будет чистый мой тупняк. Слабонервным дальше не читать. Итак, для чего вообще нужны указатели? Я вот не пойму, зачем их надо было...

Для чего нужны и зачем использовать smart-указатели?
В Страуструпе не нашел, кто подскжает где можно про них прочитать ?)

Для чего могут на мой сайт на VPS делаться следующие запросы и что они означают?
Здравствуйте! Подскажите, пожалуйста, для чего могут на мой сайт на VPS делаться следующие запросы и что они означают? 185.49.14.190 -...

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


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

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

Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru