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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача в функцию по ссылке и по значению, А если передавать указатель?  
V
    Опции темы
Gunslinger
Дата 11.12.2009, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



С одной стороны указатель передается не по ссылке, значит по значению. Тогда значение указателя копируется в функцию. Но это же указатель, никакой разницы нет, как передавать - все равно в нем хранится только адрес переменной.. Или смысла в передаче указателя по ссылке нет?

з.ы. или это надо, чтобы после выхода из функции адрес указателя сохранился таким, как его изменили в функции?
PM MAIL   Вверх
mes
Дата 11.12.2009, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Gunslinger @  11.12.2009,  22:08 Найти цитируемый пост)
з.ы. или это надо, чтобы после выхода из функции адрес указателя сохранился таким, как его изменили в функции? 

 smile 
почувствуйте разницу между передача копии и передача по имени (она же по ссылке) т.е оригинала
smile



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


Серийный программист
****


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

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



Цитата(Gunslinger @  11.12.2009,  20:08 Найти цитируемый пост)
Или смысла в передаче указателя по ссылке нет?


почувствуй разницу

Код


void foo(char *str)
{
    str = new char[MAX_PATH];
    strcpy(str, "Hello world");
}

void boo(char *&str)
{
    str = new char[MAX_PATH];
    strcpy(str, "Hello world");
}

......
char *str = 0;

//[1]
foo(str);
//тут мы имеем 0 == str

//[2]
boo(str);
//а тут уже 0 != str



Добавлено @ 00:11
"одним словом": передавая указатель по значению(значения указателя есть адрес) можем изменить только содержимое по адресу.
передавая указатель по ссылке(передаем адрес по ссылке) можем изменить содержимое по адресу, так и значение указателя(те можем сделать так что бы указатель указывал на другой "объект")

Это сообщение отредактировал(а) chaos - 12.12.2009, 00:12
PM WWW   Вверх
Gunslinger
Дата 12.12.2009, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Значит, так и есть. Теперь вопрос по синтаксису: правильно только так 
Цитата(chaos @  12.12.2009,  00:07 Найти цитируемый пост)
(Тип *&str)

или так тоже можно - (Тип &*str).
Последовательность зависит от приоритета операций или есть смысл? 

PM MAIL   Вверх
unicuum
  Дата 12.12.2009, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

void boo(char&* str) // ошибка: недопустимая декларация указателя на ‘char&’
{
    str = new char[MAX_PATH];
    strcpy(str, "Hello world");
}


Код

void boo(char* const &str) // ссылка на константный указатель
{
    str = new char[MAX_PATH]; // ошибка: assignment of read-only reference ‘str’
    strcpy(str, "Hello world");
}


Код

void boo(const char* &str) // ссылка на указатель на константу
{
    str = new char[MAX_PATH];
    strcpy(str, "Hello world"); // ошибка: некорректное преобразование из ‘const char*’ в ‘char*’
}


Код

void boo(const char* const &str) // ссылка на константный указатель на константу
{
    str = new char[MAX_PATH]; // ошибка: assignment of read-only reference ‘str’
    strcpy(str, "Hello world"); // ошибка: некорректное преобразование из ‘const char*’ в ‘char*’
}



--------------------
user posted image
обычный день на винграде
PM   Вверх
mes
Дата 12.12.2009, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Gunslinger @  12.12.2009,  17:39 Найти цитируемый пост)
Последовательность зависит от приоритета операций или есть смысл? 

"*" и "&" в приведенном примере не являются операторами.

Цитата(Gunslinger @  12.12.2009,  17:39 Найти цитируемый пост)

или так тоже можно - (Тип &*str).

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






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


Опытный
**


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

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



Цитата(mes @  12.12.2009,  20:43 Найти цитируемый пост)
ссылка - это ассоциация с переменной, можно сказать псевдоним и у нее нет своего места в памяти - поэтому брать ссылку от ссылки, или делать указатель на ссылку нельзя.

Спасибо за подробность!

Цитата(unicuum @  12.12.2009,  19:24 Найти цитируемый пост)

Код

(char* const &str) // ссылка на константный 
(const char* &str) // ссылка на указатель на константу
(const char* const &str) // ссылка на константный указатель на константу


Цитата(chaos @  12.12.2009,  00:07 Найти цитируемый пост)
(char *&str)

Читать такие конструкции справа налево? Ссылка на константный указатель - значение указателя нельзя будет изменить или адрес? Или запрет изменения адреса - это предпоследний вариант - (const char* const &str)?
PM MAIL   Вверх
mes
Дата 13.12.2009, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Gunslinger @  13.12.2009,  09:33 Найти цитируемый пост)
Ссылка на константный указатель - значение указателя нельзя будет изменить или адрес? Или запрет изменения адреса - это предпоследний вариант

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


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


Опытный
**


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

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



mes, спасибо, понял. По поводу передачи ссылки. Вы написали, что у нее нет своего места в памяти. Интересно узнать: параметру функции присваивается адрес ссылочного аргумента или такой механизм передачи по ссылке реализуется иначе?


Это сообщение отредактировал(а) Gunslinger - 14.12.2009, 14:02
PM MAIL   Вверх
Gunslinger
Дата 15.12.2009, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Пришел только к одному объяснению: переменная-ссылка существует только на уровне листинга кода. При компиляции :
int h=12;
int &m=h;
компилятор во всех вычислениях заменяет &m на h.
PM MAIL   Вверх
mes
Дата 15.12.2009, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



 
Цитата(Gunslinger @  15.12.2009,  08:39 Найти цитируемый пост)
Пришел только к одному объяснению: переменная-ссылка существует только на уровне листинга кода.

 smile 


Цитата(Gunslinger @  15.12.2009,  08:39 Найти цитируемый пост)
компилятор во всех вычислениях заменяет &m на h. 

опечатка, не &m, а m. 
Ну если грубо, то да.. Вы задаете второе имя (псевдоним). Только надо учитывать что не все действия применяются одинаково к m и h.
smile Имеется ввиду выход за границу блока..  smile 


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


Опытный
**


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

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



Цитата(mes @  15.12.2009,  10:20 Найти цитируемый пост)
Имеется ввиду выход за границу блока..

Ага, понял.
А что развеселило в первой цитате?

Это сообщение отредактировал(а) Gunslinger - 15.12.2009, 10:51
PM MAIL   Вверх
xvr
Дата 15.12.2009, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Есть еще одна тонкость в применении ссылок:
Код

SomeObject func();

SomeObject& ref=func();
В последней строке будет созданна ссылка на объект, возвращенный функцией func. Время жизни этого объекта будет расширенно до времени жизни ссылочной переменной ref
Ни создания отдельного объекта, ни copy конструктора вызванно не будет (как в случае SomeObject ref=func();)

PM MAIL   Вверх
mes
Дата 15.12.2009, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(xvr @  15.12.2009,  11:09 Найти цитируемый пост)
SomeObject& ref=func();

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

Добавлено через 2 минуты и 42 секунды
Цитата(Gunslinger @  15.12.2009,  09:51 Найти цитируемый пост)
А что развеселило в первой цитате?

В какой ? вроде бы нигде ничего не веселило ? или Вас смайлики смутили ? это просто от хорошего настроения smile
веселение обычно выражается в таких :  smile  smile  smile 
 smile  smile  smile 



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


Опытный
**


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

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



Цитата(xvr @  15.12.2009,  12:09 Найти цитируемый пост)

Ни создания отдельного объекта, ни copy конструктора вызванно не будет (как в случае SomeObject ref=func();)

Цитата(mes @  15.12.2009,  12:36 Найти цитируемый пост)
но по правилам, насколько я знаю, временным объектом можно проинициалировать только константную ссылку.

О, еще одна непонятная тема для топикаsmile

Цитата(mes @  15.12.2009,  12:36 Найти цитируемый пост)
это просто от хорошего настроения

Ясно. А то я иногда пишу "высокопарным слогом" - остатки из прошлого.







Это сообщение отредактировал(а) Gunslinger - 15.12.2009, 13:46
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0739 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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