Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.03.2025, 12:25   #1
Салага
Пользователь
 
Регистрация: 03.03.2018
Сообщений: 25
По умолчанию Указатель на указатель

Доброго дня, люди!

Голова в процессе задумалась над таким "пустяком". И чтобы не писать самому программульку для проверки, решил спросить у умных людей сразу.

В функцию а приходит указатель на указатель на структуру - **struct_ptr
В нём может лежать указатель на структуру, а может быть NULL. Первым делом я проверяю, что в **struct_ptr у нас не вообще NULL
А дальше возник вопрос - если я передам из функции а в функцию b указатель *struct_ptr я буду работать с указателем или с копией указателя? смогу ли я в *struct_ptr поменять данные? Или в функцию b тоже придётся уже передавать указатель на указатель?

Подскажите, пожалуйста!

Пример кода

Код:


void a(type **struct_ptr)
{
   if ( struct_ptr != NULL )
      b(*struct_ptr);
}

void b( type* struct_ptr)
{



}
Салага вне форума Ответить с цитированием
Старый 06.03.2025, 12:46   #2
Салага
Пользователь
 
Регистрация: 03.03.2018
Сообщений: 25
По умолчанию

В функцию a из main я передам &struct_ptr. Что будет если в b из main я передам просто struct_ptr? Копия будет или нет?

Последний раз редактировалось Салага; 06.03.2025 в 12:54.
Салага вне форума Ответить с цитированием
Старый 07.03.2025, 06:27   #3
Алексей1153
фрилансер, препод.
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,041
По умолчанию

Салага, можно же просто попробовать

Код:
#include <iostream>

void b(int* struct_ptr)
{
    if(struct_ptr)
    {
        *struct_ptr=42;
    }
}

void a(int** struct_ptr)
{
   if(struct_ptr)
   {
      b(*struct_ptr);
   }
}

int main()
{
    int i=1;
    int* p=&i;
    a(&p);
    
    std::cout<<i;
}
Код:
42
Алексей1153 вне форума Ответить с цитированием
Старый 07.03.2025, 07:46   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,370
По умолчанию

Указатель на указатель обычно используется когда надо *вернуть* указатель на данный объект.
Если требуется только чтение то передавать указатель на указатель это лишнее.
waleri вне форума Ответить с цитированием
Старый 07.03.2025, 13:40   #5
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 193
По умолчанию

Указатель на указатель передают в функцию обычно для того, чтобы эта функция установила этот указаталь (проинициализировала).

tip1* p1;
// здесь p1 не проинициализирован и не установлен ни во что, использование p1 будет считаться неопределённым поведением
funcA( &p1);
// здесь p1 уже проинициализирован и указывает на валидную область памяти

-----
void funcA( tip1** a_p )
{
*a_p = malloc( sizeof tip1 );
}
DeepFlake вне форума Ответить с цитированием
Старый 07.03.2025, 16:29   #6
Салага
Пользователь
 
Регистрация: 03.03.2018
Сообщений: 25
По умолчанию

Спасибо вам, добрые люди!

Алексей, вам особенно за код! Скопировал себе и из main вызвал b(p). Тоже убедился, что значение поменяется.

У меня со студенчества в голове засело такое, что всё, что передано без адреса & будет являться копией

И верно подметили, что указатель на указатель, чтобы его проинициализировать и вернуть.

Спасибо!
Салага вне форума Ответить с цитированием
Старый 07.03.2025, 17:21   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,828
По умолчанию

Цитата:
Сообщение от Салага Посмотреть сообщение
У меня со студенчества в голове засело такое, что всё, что передано без адреса & будет являться копией
Плохо вы учились. Все параметры передаются по значению. Вопрос только в том, что вы передаете - само значение, адрес на значение или адрес на адрес, или ссылку.
p51x вне форума Ответить с цитированием
Старый 07.03.2025, 19:29   #8
Алексей1153
фрилансер, препод.
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,041
По умолчанию

Цитата:
Сообщение от Салага Посмотреть сообщение
Скопировал себе и из main вызвал b(p).
таки речь про C++, а не про C , раз скомпилилось. Заголовок то плюснутый

Тогда нужно себя не путать и передавать по ссылке то, что нужно поменять внутри функции
Код:
#include <iostream>

void b(int& i)
{
    i=42;
}

void a(int& i)
{
    b(i);
}

int main()
{
    int i=1;
    a(i);
    
    std::cout<<i;
}
передача неконстантного указателя на объект позволяет произвести над объектом такие же действия, как при передаче по неконстантной ссылке.

Если передаётся адрес "внешнего" указателя, то этот указатель можно будет внутри функции.
Если указатель передаётся по значению, то в функции будет его копия. Если менять копию, "внешний" объект (с которого копия была сделана) не меняется
Алексей1153 вне форума Ответить с цитированием
Старый 07.03.2025, 19:36   #9
Алексей1153
фрилансер, препод.
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,041
По умолчанию

Код:
#include <iostream>

void assign_pointer(int& i, int*& p)
{
    //присваиваем указателю новое значение-
    //адрес переменной i, переданной по ссылке
    p=&i;
}

int main()
{
    int i=42;
    
    int* p{};
    
    assign_pointer(i,p);
    
    std::cout<<*p<<'\n';
    *p=13;
    std::cout<<*p;
}
Код:
42
13
Алексей1153 вне форума Ответить с цитированием
Старый 07.03.2025, 19:53   #10
Салага
Пользователь
 
Регистрация: 03.03.2018
Сообщений: 25
По умолчанию

Алексей, ну уж что такое iostream я понимаю, не целиком прям взял и скопировал

р51х, получается если в адресе на адрес у меня не NULL, а адрес на значение, то я этот адрес на значение могу передавать уже куда хочу и сколько хочу и делать там с самим значением что угодно. Верно?
Салага вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C++]: Почему функция в этом коде принимает в качестве аргумента указатель на указатель? nwhta Общие вопросы C/C++ 5 04.01.2017 18:09
массив Указатель на указатель fr0st1k123 Общие вопросы C/C++ 3 27.12.2015 18:06
Указатель Sektr63 Общие вопросы C/C++ 6 30.03.2013 15:52
Передать указатель на указатель в функцию erro Общие вопросы C/C++ 3 29.10.2012 17:59
Указатель... Romario92 Общие вопросы C/C++ 16 22.10.2010 20:37