Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > интереснейший пример


Автор: lamber 24.1.2011, 00:27
Вечером решил бегло пробежатся по айти ресурсам, с целью почитать что люди пишут а может и постараться помочь кому-то в нелегком изучении программирования а в часности таких языков как C/C++. И вот на stackoverflow.com нарвался на интересейший пример, хотел было отправить автору своего предположение (хорошо что не сделал т.к. оно было ошибочным). К чему много слов вот сам пример.

Код

  void func(int *p)
{
    p = new int(1);

}
int main ()
{
int *p = NULL;
cout<<p<<endl;

func(p);

cout<<p<<endl;

getchar();
}


По идее после выполнение функции указатель p должен ссылаться на переменную со значением 1, но он все так же ссылается на NULL почему спрашивается

Автор: mes 24.1.2011, 00:38
потому что указатель передается как копия..

Автор: lamber 24.1.2011, 00:51
но как же так, что бы передать по значению можно использовать дву вещи это передача по ссылке либо передача указателя. 

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

Какой код будет правильный mes :?

Автор: volatile 24.1.2011, 00:56
Имхо, чтобы функция могла менять указатель можно сделать например так:
Код

void func(int **p)
{
    *p = new int(1);
}
int main ()
{
    int *p = NULL;
    cout<<p<<endl;
    func(&p);
    cout<<p<<endl;
    getchar();
}

Автор: KaraKum 24.1.2011, 00:58
Вот так нужно объявить функцию если нужно чтобы изменялся сам указатель:
Код

void func(int *&p)
{
    p = new int(1);
}

Автор: lamber 24.1.2011, 01:08
volatile но зачем объявлять указатель на указатель в чем причина :? где об этой особенности можно прочитать :?

KaraKum впервые вижу такую языковую конструкцию, объясни что она делает  и где опять же о ней прочитать если так разобрать то получается *&p=>**p 

Одни предположения вообщем 

Автор: volatile 24.1.2011, 01:18
Как правильно указал mes, у Вас передается копия указателя.
Чтобы функция могла менять сам указатель нужно его передать либо по ссылке (вариант KaraKum), либо по указателю (мой вариант.)

Автор: Фантом 24.1.2011, 01:28
Цитата(lamber @  24.1.2011,  01:08 Найти цитируемый пост)
но зачем объявлять указатель на указатель в чем причина :? 

Так ведь стандартный случай - все параметры функций всегда передаются по значению. Если что-то требуется изменить внутри функции и вернуть обратно, то нужно либо передать указатель на это "что-то" (C/C++), либо ссылку на это "что-то" (С++). И даже если это "что-то" само по себе является указателем, на него все эти соображения распространяется точно так же.


Автор: kemiisto 24.1.2011, 01:30
Бедняга.

Автор: azesmcar 24.1.2011, 06:04
lamber

Все нормально. Есть объекты, есть указатели. Ты передаешь по указателю объект, а указатель по значению, т.е. сам указатель копируется, а объект - нет. В конце концов указатель это обычный тип, который хранит адрес. Его тоже можно передавать по указателю или по ссылке.

Автор: lamber 24.1.2011, 09:14
М-да интересный момент, у Шилдта в его справочнике и у Либерти этого не нашел. Ну чтож спасибо за разъяснения, хорошо когда есть куда рости, тему можно закрывать.

Автор: xvr 24.1.2011, 14:43
Цитата(lamber @  24.1.2011,  00:27 Найти цитируемый пост)
По идее после выполнение функции указатель p должен ссылаться на переменную со значением 1, но он все так же ссылается на NULL почему спрашивается

Цитата

О сколько нам открытий чудных 
Готовит просвещения дух!
Дерзайте, в C++ еще столько неоткрытого осталось!  smile 

Автор: boostcoder 24.1.2011, 16:07
Цитата(lamber @  24.1.2011,  00:27 Найти цитируемый пост)
на stackoverflow.com нарвался на интересейший пример

пруф, пожалуйста.

Автор: xvr 24.1.2011, 19:49
Цитата(boostcoder @ 24.1.2011,  16:07)
Цитата(lamber @  24.1.2011,  00:27 Найти цитируемый пост)
на stackoverflow.com нарвался на интересейший пример

пруф, пожалуйста.

Пруф чего? Того, что это 'интереснейший пример'?  smile 

Автор: boostcoder 24.1.2011, 20:01
Цитата(xvr @  24.1.2011,  19:49 Найти цитируемый пост)
Пруф чего?

пруф на пост, на который ТС хотел ответить.

Автор: lamber 24.1.2011, 22:04
Пруф линк
http://stackoverflow.com/questions/4776010/pass-by-reference-and-value-with-pointers

Автор: boostcoder 24.1.2011, 22:07
Цитата(lamber @ 24.1.2011,  22:04)
Пруф линк
http://stackoverflow.com/questions/4776010/pass-by-reference-and-value-with-pointers

ага.
спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)