Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.89/19: Рейтинг темы: голосов - 19, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 16

Ссылка на указатель. Проблема

05.05.2020, 15:24. Показов 4072. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем, привет! На днях появилась проблема. Не понимаю, что таеое ссылка на указатель. Я понимаю как работает и сслыка и указатель отдельно. А вместе не понимаю. Зачем она нужна, когда приминяется?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
void func(int *&mas, int n, int value){
int arr=new int[n+1];
for (int i=0; i<n; i++){
arr[i]=mas[i];
}
arr[n]=value;
n++;
delete[] mas;
mas=arr;
}
Void main(){
Int Size=10;
int spisok=new int[Size];
func(spisok,size;54);
}
Подскажите почему я не могу вместо ссылки на указатель взять просто указатель в итоге мы же можем изменить в функции адресс параметра?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.05.2020, 15:24
Ответы с готовыми решениями:

Указатель или ссылка на указатель. В чем разница?
Есть вопрос про указатели и ссылки на указатели :scratch: Хочу в функциях f1() и в f2() динамически выделить память и возвратить этот...

Ссылка на указатель на указатель
void TEST( int **&amp;refptr, int const &amp;N); int main() { int const N = 10; int i{ 0 }, b{ 2 }, *ptr{ &amp;i, &amp;b }; ...

Указатель и ссылка
В общем вопрос достаточно простой, в чём разница указателя и сылки? С одной стороны указатель это отдельный тип, отдельная ячейка в...

36
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 16
05.05.2020, 17:50  [ТС]
Студворк — интернет-сервис помощи студентам
так и там и там при вызове функции передается, сам указатель, только в описании функции в первом коде стоит просто *pr, а во втором *&arr, почему?
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
05.05.2020, 17:55
Лучший ответ Сообщение было отмечено ShoOstiZ как решение

Решение

Цитата Сообщение от ShoOstiZ Посмотреть сообщение
так и там и там при вызове функции передается, сам указатель
Эти примеры в первую очередь отличаются тем что вы делаете внутри функции и какой результат пытаетесь получить:
Первый код меняет значение переменной по указателю. А второй код меняет сам указатель.

Поэтому во втором коде используют ссылку, чтобы изменения были видны на вызывающей стороне.

Прочтите еще раз мои посты выше.
0
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 16
05.05.2020, 18:11  [ТС]
спасибо огромное, разобрался. Можете еще рассказать про указатель на указать, а то не понимаю, когда он тоже используется, и для чего нужен
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
05.05.2020, 18:18
ShoOstiZ, я же уже рассказал выше на примере вашего вопроса.
0
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 16
05.05.2020, 18:24  [ТС]
Понял спасибо. А как работает ссылка на указатель, не как через что мы параметры передаем, а просто к примеру в главной функции main
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
05.05.2020, 19:20
Цитата Сообщение от ShoOstiZ Посмотреть сообщение
А как работает ссылка на указатель
Проще на данном этапе вам ссылку на указатель понять как неизменяемый (константный) указатель на указатель.
0
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 16
06.05.2020, 09:04  [ТС]
А вы в функции взяли и просто изменили адрес локального указателя этого?

Добавлено через 2 часа 23 минуты
Почему, когда мы передаем в параметр по указателю, в функции он не запоминает при изменении адреса, а когда мы передает в параметр по ссылке на указатель, то запоминает, и отображается в main? и там и там мы передаем адрес.
Пример:
int a=10;
int *px=a;
func(px); //px же адресс
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
06.05.2020, 15:57
Лучший ответ Сообщение было отмечено ShoOstiZ как решение

Решение

ShoOstiZ, без ссылки делается копия и изменяется внутри функции тоже копия. А ссылка даёт возможность работать с оригинальным обьектом из main
1
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 16
06.05.2020, 16:28  [ТС]
спасибо, а почему тогда здесь в мэйне разименнованное значение тоже меняется в мэйне, также же с копией работаем в функции, или это относится только к адресу?
void fri(int *px){
(*px)++;
}
void main(){
int k=8;
int *pr=&k;
fri(pr);
cout<<*pr<<endl;
}
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
06.05.2020, 16:35
Цитата Сообщение от ShoOstiZ Посмотреть сообщение
относится только к адресу?
Да, переменная (pr) же у нас адрес содержит. Вот она и скопировалась (в - px).
0
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 16
06.05.2020, 18:19  [ТС]
Про адресс я понял, но тогда почему в данном коде у нас изменяется разименнованое значение, если int* это такой же тип данных, и получается переходит передача в парметр по значению, значет измен не должно быть
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
06.05.2020, 19:39
ShoOstiZ, по значению у вас передается сам адрес. и он не меняется.

Добавлено через 12 минут
ShoOstiZ, ладно, давайте на пальцах. Что-то у вас совсем туго идет.

Представьте, есть ячейка в камере хранения вокзала. В вашем примере за эту ячейку примем переменную k. Далее у вас есть ключ от этой ячейки, в вашем примере - это переменная pr. Потом вы хотите, чтобы ваш друг (в вашем примере это функция fri) добавил в эту ячейку некие вещи, для этого вы делаете копию ключа и отдаете ее ему (в вашем примере копия ключа - это px). Затем ваш друг идет в камеру хранения и добавляет в ячейку вещи.
Естественно, если ваш друг сломает или потеряет свою копию ключа, то ваш собственный ключ от этого никак не пострадает. Логично?

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

Теперь вы внимательно читаете это мое описание до тех пор, пока не поймете. Понятнее уже некуда.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
06.05.2020, 19:52
Цитата Сообщение от DrOffset Посмотреть сообщение
Теперь вы внимательно читаете это мое описание до тех пор, пока не поймете. Понятнее уже некуда.
я запутался уже когда сделали копию "ключа от ключа" и друг пошел используя свою копию
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
06.05.2020, 19:56
Цитата Сообщение от _stanislav Посмотреть сообщение
я запутался уже когда сделали копию "ключа от ключа" и друг пошел используя свою копию
Значит читай еще раз.
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
06.05.2020, 20:57
ShoOstiZ,
вот тут вроде бы видно косвенное обращение к памяти:

Assembler
1
2
3
;*p = 1;
00831728  mov         eax,dword ptr [p]  
0083172B  mov         dword ptr [eax],1
C++
1
2
3
4
void F1(int * p)
{
    *p = 1;
}
Assembler
1
2
3
4
;* * p = 1;
00E11788  mov         eax,dword ptr [p]  
00E1178B  mov         ecx,dword ptr [eax]  
00E1178D  mov         dword ptr [ecx],1
C++
1
2
3
4
void F2(int * * p)
{
    * * p = 1;
}
Добавлено через 53 минуты
передача указателя на указатель в функцию:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
;int i = 0
00191802  mov         dword ptr [i],0  
;int * p = &i;
00191809  lea         eax,[i]  
0019180C  mov         dword ptr [p],eax  
    
;F1(p)
0019180F  mov         eax,dword ptr [p]  
    
;F1(p)
00191812  push        eax  
00191813  call        F1 (01912D5h)  
00191818  add         esp,4  
;F2(&p)
0019181B  lea         eax,[p]
C++
1
2
3
4
5
6
7
8
9
10
int main()
{
    int i = 0;
    int * p = &i;
    
    F1(p);
    F2(&p);
 
    return 0;
}
1
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 16
07.05.2020, 05:50  [ТС]
Cпасибо, вам огромное теперь все до конца разобрался
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
24.10.2020, 14:34
Цитата Сообщение от ShoOstiZ Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
void fri(int *px){
(*px)++;
}
 
void main(){
int k=8;
int *pr=&k;
fri(pr);
cout<<*pr<<endl;
}
если не удобно читать - напишите так int* pr=&k; - тогда понятно, что передавая pr в функцию - передаёте указатель, проинициализированный адресом переменной k... разыменовываете указатель в функции fri строкой (*px) !после чего !значение инкрементируете на 1 с пом ++... скобки важны!.. без скобок была бы др. последовательность действий и др результат...
вобщем, возвращаете 9 т.е. 8+1 = 9
без скобок вернули бы 8
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.10.2020, 14:34

Ссылка на указатель
Почему не работает такая конструкция? void SwapInt(void* p1, void* p2) { int* &amp; tmp=static_cast&lt;int*&gt;(p2); } и как...

Указатель и ссылка
Почему выгодней использовать указатель а не ссылку при использовании массивов?

Ссылка на указатель
Задам, скорее всего, глупый вопрос, однако хотелось бы разобраться. // ... { int *ptr = new int; int &amp;x = *ptr; ...

Указатель и ссылка
Помогите понять, немного запутался. #include&lt;iostream&gt; using namespace std; void ch1 (int *pa1); int main() {

Ссылка на указатель
Привет всем, пишу класс реализующий стек, объявил вершину стека как приватный элемент. Написал метод Push - который должен добавить в...


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

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru