Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
 Аватар для kcalbCube
15 / 13 / 4
Регистрация: 16.08.2018
Сообщений: 125

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

18.08.2018, 03:47. Показов 4466. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru