Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> интереснейший пример, работа с указателями 
:(
    Опции темы
lamber
Дата 24.1.2011, 00:27 (ссылка)    | (голосов:7) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 20.12.2008

Репутация: нет
Всего: нет



Вечером решил бегло пробежатся по айти ресурсам, с целью почитать что люди пишут а может и постараться помочь кому-то в нелегком изучении программирования а в часности таких языков как 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 почему спрашивается
PM MAIL   Вверх
mes
Дата 24.1.2011, 00:38 (ссылка) |    (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



потому что указатель передается как копия..


--------------------
PM MAIL WWW   Вверх
lamber
Дата 24.1.2011, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 20.12.2008

Репутация: нет
Всего: нет



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

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

Какой код будет правильный mes :?
PM MAIL   Вверх
volatile
Дата 24.1.2011, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



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

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

PM MAIL   Вверх
KaraKum
Дата 24.1.2011, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: 1
Всего: 1



Вот так нужно объявить функцию если нужно чтобы изменялся сам указатель:
Код

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

PM MAIL WWW   Вверх
lamber
Дата 24.1.2011, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 20.12.2008

Репутация: нет
Всего: нет



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

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

Одни предположения вообщем 
PM MAIL   Вверх
volatile
Дата 24.1.2011, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



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

Это сообщение отредактировал(а) volatile - 24.1.2011, 01:19
PM MAIL   Вверх
Фантом
Дата 24.1.2011, 01:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: нет
Всего: 49



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

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


PM   Вверх
kemiisto
Дата 24.1.2011, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 2
Всего: 160



Бедняга.


--------------------
PM MAIL WWW GTalk Jabber   Вверх
azesmcar
Дата 24.1.2011, 06:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



lamber

Все нормально. Есть объекты, есть указатели. Ты передаешь по указателю объект, а указатель по значению, т.е. сам указатель копируется, а объект - нет. В конце концов указатель это обычный тип, который хранит адрес. Его тоже можно передавать по указателю или по ссылке.
PM   Вверх
lamber
Дата 24.1.2011, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 20.12.2008

Репутация: нет
Всего: нет



М-да интересный момент, у Шилдта в его справочнике и у Либерти этого не нашел. Ну чтож спасибо за разъяснения, хорошо когда есть куда рости, тему можно закрывать.
PM MAIL   Вверх
xvr
Дата 24.1.2011, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



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

Цитата

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

PM MAIL   Вверх
boostcoder
Дата 24.1.2011, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



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

пруф, пожалуйста.
PM WWW   Вверх
xvr
Дата 24.1.2011, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



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

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

Пруф чего? Того, что это 'интереснейший пример'?  smile 
PM MAIL   Вверх
boostcoder
Дата 24.1.2011, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



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

пруф на пост, на который ТС хотел ответить.
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0848 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.