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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2012, 20:30   #1
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию Не получается получить значение из функции через указатель

Почему после выхода из функции valuePointer всё равно NULL?
Код:
#include "locale"
#include <iostream>

void SomeFunction(int*);

int main()
{
	setlocale(LC_ALL, "Rus");
	
	int* valuePointer = NULL;
	SomeFunction(valuePointer);
	std::cout << *valuePointer;
	system("pause");
}

void SomeFunction(int* valuePointer)
{
	int* some = new int(50);
	valuePointer = some;
}
Casper-SC вне форума Ответить с цитированием
Старый 11.01.2012, 20:48   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

потому что вы передаете копию указателя, а не его самого.

более простой пример это
Код:
#include "locale"
#include <iostream>

void SomeFunction(int);

int main()
{
	setlocale(LC_ALL, "Rus");
	
	int* valuePointer = NULL;
	SomeFunction(valuePointer);
	std::cout << *valuePointer;
	system("pause");
}

void SomeFunction(int value)
{
	value = 50;
}
примените ссылку или указатель(к вашему типу, значит указатель на указатель):
Код:
#include "locale"
#include <iostream>

void SomeFunction(int* &);

int main()
{
	setlocale(LC_ALL, "Rus");
	
	int* valuePointer = NULL;
	SomeFunction(valuePointer);
	std::cout << valuePointer;//что за разименовывания для вывода самого указателя?
	system("pause");
}

void SomeFunction(int* &valuePointer)
{
	valuePointer = new int(50);
}
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.01.2012, 20:56   #3
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Код:
	std::cout << valuePointer;//что за разименовывания для вывода самого указателя?
Не, для вывода значения на экран.

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
потому что вы передаете копию указателя, а не его самого.
Хм, а на первый взгляд как-то неочивидно (для меня пока-что).

Спасибо, заработало. Но пока что-то не совсем осознаю как оно работает и почему передавалась копия указателя. Видимо ещё не всё прочитал по указателям в книге.
Casper-SC вне форума Ответить с цитированием
Старый 11.01.2012, 21:01   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

тут не важно указатель или не указатель.
у вас есть понятие, сама переменная или указатель/ссылка на нее.
в первом случае будет копия, во втором соответственно указатель/ссылка через которую и будете менять данные.
Цитата:
Не, для вывода значения на экран.
вам нужно вывести указатель или данные через него?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.01.2012, 00:37   #5
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
вам нужно вывести указатель или данные через него?
Не, именно данные, поэтому я и сказал "значение". Про то как вывести адрес я знаю, надо не разыменовывать "*", а получать адрес "&".
Casper-SC вне форума Ответить с цитированием
Старый 12.01.2012, 06:32   #6
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от Casper-SC Посмотреть сообщение
Про то как вывести адрес я знаю, надо не разыменовывать "*", а получать адрес "&".
Если вы будите получать адрес указателя, то выведите не тот адрес, который он содержит, а адрес, по которому, он хранится
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу получить значение от функции Sauber Общие вопросы C/C++ 1 16.11.2011 02:33
Не удается получить указатель на метод systemmind Общие вопросы C/C++ 1 22.09.2011 22:57
Создать массив в функции, через указатель. Как? TwiX Общие вопросы Delphi 10 01.04.2010 11:36
Значение через указатель. Alex Cones Общие вопросы Delphi 8 24.01.2010 18:15
Работа с TStringList через указатель. Mixasik Общие вопросы Delphi 2 08.01.2009 12:51