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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2014, 13:19   #1
ncAlex
 
Регистрация: 10.04.2014
Сообщений: 6
По умолчанию Передача указателя в функцию, присвоение адреса переменной и возврат

Добрый день, подскажите, почему в отладке в функции указателю адрес переменной присваивается корректно, но при возврате указатель смотрит по прежнему адресу (здесь на NULL, скажем). необходимо получить адрес структуры g_Prm. Возврат return-ом не интересует. Именно такая конструкция. Или необходимо использовать указатель на указатель?

Код:

TStructParam  g_Prm;

void GetParam (TStructParam   *apPtr)
{
   apPtr = &g_Ptr;
}

int main ()
{
  TStructParam *tCurPrm = NULL;

  GetParam (tCurPrm);
  return 1;
}
ncAlex вне форума Ответить с цитированием
Старый 10.04.2014, 13:21   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вы хотите изменить сам указатель, для этого надо применить указатель на указатель
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.04.2014, 14:23   #3
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от ncAlex Посмотреть сообщение
Добрый день, подскажите, почему в отладке в функции указателю адрес переменной присваивается корректно, но при возврате указатель смотрит по прежнему адресу (здесь на NULL, скажем). необходимо получить адрес структуры g_Prm. Возврат return-ом не интересует. Именно такая конструкция. Или необходимо использовать указатель на указатель?

Код:

TStructParam  g_Prm;

void GetParam (TStructParam   *apPtr) //<--- внутри функции копия указателя, который был передан снаружи
{
   apPtr = &g_Ptr;  //<--- копия указателя получает значение
}

//<--- вот здесь оригинальный указатель как был, так и остался
// потому что модифицирована была копия


int main ()
{
  TStructParam *tCurPrm = NULL;

  GetParam (tCurPrm);
  return 1;
}

Код:
TStructParam  g_Prm;

void GetParam (TStructParam*& apPtr) //<--- ссылка позволяет работать с оригинальным объектом
{
   apPtr = &g_Ptr;  //<--- меняем оригинальный указатель
}

//<--- оригинальный указатель изменен

int main ()
{
  TStructParam *tCurPrm = NULL;

  GetParam (tCurPrm);
  return 1;
}
_Bers вне форума Ответить с цитированием
Старый 10.04.2014, 14:48   #4
ncAlex
 
Регистрация: 10.04.2014
Сообщений: 6
По умолчанию

Благодарю за ответы!
Вариант со ссылкой по-моему идентичен варианту указатель на указатель?
Код:
TStructParam  g_Prm;

void GetParam (TStructParam   **apPtr)
{
   *apPtr = &g_Ptr;
}

int main ()
{
  TStructParam **tCurPrm = NULL;

  GetParam (tCurPrm);
  return 1;
}
ncAlex вне форума Ответить с цитированием
Старый 10.04.2014, 14:55   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от ncAlex Посмотреть сообщение
Благодарю за ответы!
Вариант со ссылкой по-моему идентичен варианту указатель на указатель?
Код:
TStructParam  g_Prm;

void GetParam (TStructParam   **apPtr)
{
   *apPtr = &g_Ptr;
}

int main ()
{
  TStructParam **tCurPrm = NULL;

  GetParam (tCurPrm);
  return 1;
}
по сути да, но он немного удобнее, и еще нельзя изменить саму ссылку.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.04.2014, 15:18   #6
ncAlex
 
Регистрация: 10.04.2014
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
по сути да, но он немного удобнее, и еще нельзя изменить саму ссылку.
Почему-то ваш вариант со ссылкой работает, а мой с двойным указателем нет...Просто интересно почему...Может ошибка в синтаксисе (со звездочками где-то)?
ncAlex вне форума Ответить с цитированием
Старый 10.04.2014, 15:26   #7
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,120
По умолчанию

Почему-то ваш вариант со ссылкой работает, а мой с двойным указателем нет..

Зазвездился)

TStructParam *tCurPrm = NULL;
GetParam (&tCurPrm);
Rififi вне форума Ответить с цитированием
Старый 10.04.2014, 17:08   #8
ncAlex
 
Регистрация: 10.04.2014
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Rififi Посмотреть сообщение
Почему-то ваш вариант со ссылкой работает, а мой с двойным указателем нет..

Зазвездился)

TStructParam *tCurPrm = NULL;
GetParam (&tCurPrm);
Этот вариант да, он как раз работает. Неужели нельзя то же самое через
TStructParam **tCurPrm = NULL; сделать?
ncAlex вне форума Ответить с цитированием
Старый 11.04.2014, 08:11   #9
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Нельзя. Ты обнуляешь указатель на указатель, а не сам указатель.
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 11.04.2014, 11:15   #10
ncAlex
 
Регистрация: 10.04.2014
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Krok27 Посмотреть сообщение
Нельзя. Ты обнуляешь указатель на указатель, а не сам указатель.
Это понятно..но это делает при инициализации его. Далее то где он обнуляется? Точнее указывает на NULL.
ncAlex вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
передача в функцию указателя на начало массива dasvex Помощь студентам 4 28.08.2011 09:29
Передача в функцию указателя на динамический массив Airou Общие вопросы C/C++ 4 05.05.2011 17:07
Присвоение и передача значения переменной из HTML в PHP alexscorp1661 Помощь студентам 1 18.04.2010 11:33
Передача указателя на массив в функцию loser Общие вопросы C/C++ 2 19.02.2010 19:41
передача указателя в функцию arturka Помощь студентам 3 06.07.2008 00:25