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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2012, 18:28   #1
Jack125
Пользователь
 
Регистрация: 16.10.2010
Сообщений: 24
По умолчанию Небольшой вопрос про структуру

Доброго времени суток

Допустим, есть указатель на структуру, которой нужно присвоить значение. Сделать это нужно при помощи небольшой процедуры, которая создает по этому адресу структуру и присваивает ей значение.
Код:
#include<iostream>

using namespace std;
struct STR{
	int ch;};

void Proc(STR *st)
{
	    st=new STR;
		st->ch=45;
}

int main()
{
	STR* st=NULL;                    //объявляем указатель на структуру
	Proc(st);                        //присваиваем элементу этой структуры значение 45
	cout<<st->ch;                    //выводим его
	return 0;
}
Тем не менее, cout почему-то возвращает значение адреса структуры, которое было до входа в процедуру, т.е. NULL, и поэтому происходит прекращение работы программы. Как можно изменить программу, чтобы она правильно работала?

Заранее благодарен за помощь
Jack125 вне форума Ответить с цитированием
Старый 07.03.2012, 19:04   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Важно понимать одну простую вещь: аргументы, передаваемые в функцию всегда копируются.

Таким образом, в теле функции фигурируют копии тех сущностей, что передавались в функцию снаружи, а вовсе не оригиналы.

Что бы иметь возможность изнутри функции воздействовать на оригинальную сущность, нужно в функцию передавать аргумент по ссылке

Тогда, внутри функции будет фигурировать копия этой ссылки. Потому что, аргументы, передаваемые в функцию всегда копируются.
А копия ссылки, которая ссылается на оригинал, тоже будет ссылаться на этот же оригинал:

Код:
void Proc(STR* &st)  //<--- Внимательно смотрим сюда
{
	    st=new STR;
		st->ch=45;
}
/зы В представленном коде присутствует утечка памяти.

Последний раз редактировалось _Bers; 07.03.2012 в 20:05. Причина: исправлен текст исходного кода.
_Bers вне форума Ответить с цитированием
Старый 07.03.2012, 19:43   #3
Jack125
Пользователь
 
Регистрация: 16.10.2010
Сообщений: 24
По умолчанию

Но тогда возникает error C2528: st: недопустимый указатель на ссылку. Можно ли это исправить?
Jack125 вне форума Ответить с цитированием
Старый 07.03.2012, 20:04   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

а, блин! STR* &st
_Bers вне форума Ответить с цитированием
Старый 08.03.2012, 14:15   #5
Jack125
Пользователь
 
Регистрация: 16.10.2010
Сообщений: 24
По умолчанию

Большое спасибо за помощь
Jack125 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Небольшой вопрос qwerty123451 C++ Builder 3 27.03.2012 12:03
небольшой вопрос peq Microsoft Office Excel 3 23.12.2009 11:06
Небольшой вопрос про массив grave123 Общие вопросы C/C++ 8 06.12.2009 16:46
Вопрос наверное про функции, а так точно даже не знаю про что. (Вопрос начинющего #6) Albert2008 Общие вопросы Delphi 4 21.08.2008 15:33