Форум программистов, компьютерный форум CyberForum.ru

Указатели - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 5.00
Aaxenon
Light Knight
 Аватар для Aaxenon
106 / 29 / 3
Регистрация: 03.06.2010
Сообщений: 361
29.12.2010, 12:56     Указатели #1
нашел у Страуструпа вот такую функцию:
C++
1
2
3
4
5
6
void swap(int *p, int *q)
{
int t = *p;
*p = *q;
*q = t;
}
зачем здесь указатели, почему нельзя просто использовать переменные?и вообще для чего используются указатели, в чем необходимость их использования?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2010, 12:56     Указатели
Посмотрите здесь:

C++ Указатели
Указатели.... C++
C++ Указатели
Указатели C++
Указатели. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
oxotnik
 Аватар для oxotnik
1584 / 1061 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
29.12.2010, 13:00     Указатели #2
Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
зачем здесь указатели, почему нельзя просто использовать переменные?
не нужны по идее указатели
Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
и вообще для чего используются указатели, в чем необходимость их использования?
это наследие языка Си, где не было высокоуровневых средств работы с памятью
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
29.12.2010, 13:00     Указатели #3
Изменяемые параметры нельзя передавать по значению. И хотя здесь значения просто меняются местами, но у каждого параметра отдельно значение должно именно измениться, так что он изменяемый. Поэтому функции надо передать инфу о том, где находятся параметры. Но лучше так:
C++
1
2
3
4
5
6
void swap(int &p, int &q)
{
 int t = p;
 p = q;
 q = t;
}
yanyk1n
 Аватар для yanyk1n
4324 / 1455 / 152
Регистрация: 12.03.2009
Сообщений: 5,310
29.12.2010, 13:02     Указатели #4
RoY_Mu$T@nG, при обычном (int a, int b) функция работает с локальными копиями перменных, которые уничтожаются при завершении работы функции. Через указатель можно передать реальный адрес переменной, т.е. передаётся не её копия, а сама переменная. Тогда значение изменится (при помощи разыменования указателя)
Aaxenon
Light Knight
 Аватар для Aaxenon
106 / 29 / 3
Регистрация: 03.06.2010
Сообщений: 361
29.12.2010, 13:04  [ТС]     Указатели #5
т.е. в С++ можно спокойно жить без них?)
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
29.12.2010, 13:04     Указатели #6
taras atavin, Не лучше.
С указателями очевиднее. Ибо при ссылке мы посылаем в функцию просто параметры. А при указателях мы посылаем адреса переменных. Сам же Страуструп пишет, что это лучше.
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
29.12.2010, 13:14     Указатели #7
Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
т.е. в С++ можно спокойно жить без них?)
как уже сказали, то конкретно данную задачу в C++ можно решить либо через указатели, либо через ссылки (которые были добавлены для удобства, если я не ошибаюсь). Если передавать переменные по значению, ничего не выйдет. А насчет того, можно ли жить в С++ без указателей, то могу тебя огорчить - явно либо неявно, но использовать указатели тебе придется. К примеру, массивы в С++ - это нично иное, как указатели. Или еще пример - попробуй построить связный список без использования указателей.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
29.12.2010, 13:18     Указатели #8
Nameless One, Ну если использовать STL использовать указатели не нужно) Явно, ибо неявно все равно их используем.
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
29.12.2010, 13:19     Указатели #9
Цитата Сообщение от ForEveR Посмотреть сообщение
Nameless One, Ну если использовать STL использовать указатели не нужно) Явно, ибо неявно все равно их используем.
Это я как раз и подразумевал под неявным использованием
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
29.12.2010, 13:20     Указатели #10
Цитата Сообщение от ForEveR Посмотреть сообщение
С указателями очевиднее.
А потом ты где нибудь забудешь & перед именем фактического параметра. И чем это лучше? А об изменяемости параметров и о том, как именно они меняются, должно говорить имя функции. Если оно ни о чём не говорит, то мало ли как могу измениться параметры, переданные по указателю? Так что лучше как раз по ссылке.
Цитата Сообщение от RoY_Mu$T@nG Посмотреть сообщение
т.е. в С++ можно спокойно жить без них?)
Нет. Все динамические данные могут быть основаны только на указателях, но не на ссылках. Да и массив проблематично передать по ссылке. Но там, где ссылки не добавляют сложностей, надо заменять ими указатели.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
29.12.2010, 13:22     Указатели #11
taras atavin, А потом ты где-нибудь забудешь написать & перед именем формального параметра... Так что про забывчивость говорить не стоит. Людям это свойственно. Неконстантные ссылки лучше не использовать. Хоть и проще.
yanyk1n
 Аватар для yanyk1n
4324 / 1455 / 152
Регистрация: 12.03.2009
Сообщений: 5,310
29.12.2010, 13:23     Указатели #12
Цитата Сообщение от taras atavin Посмотреть сообщение
Все динамические данные могут быть основаны только на указателях, но не на ссылках.
А как же возвращение значения по ссылке?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
29.12.2010, 13:25     Указатели #13
yanyk1n, Ну смотря что ты имеешь ввиду... Пример можно?
yanyk1n
 Аватар для yanyk1n
4324 / 1455 / 152
Регистрация: 12.03.2009
Сообщений: 5,310
29.12.2010, 13:27     Указатели #14
ForEveR, ну... к примеру перегрузка оператора <<, чтобы можно было использовать конструкции типа
C++
1
2
My_Class my_object;
cout << my_object << endl;
Вроде как там тоже построено на механизме указателей
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
29.12.2010, 13:28     Указатели #15
Цитата Сообщение от ForEveR Посмотреть сообщение
Неконстантные ссылки лучше не использовать.
Наоборот, константные. Ты пихаешь параметры в первую попавшуюся функцию, совместимую по типам? Тогда счастливой отладки. Имя говорит о том, как именно меняются параметры, а передача по указателю - только о факте их изменения, причём, это запросто могут быть и массивы с каким угодно числом элементов и получай ошибку доступа (функция думает, что ей передан массив) за пределы параметра (на самом деле это отдельная переменная). Константные же ссылки ничего не дают, кроме запрета на передачу констант в качестве параметров (стековая оптимизация - задача не автора логики).
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
29.12.2010, 13:35     Указатели #16
yanyk1n, По ссылке там построено.

C++
1
2
3
4
5
std::ostream& operator(std::ostream& os, const MyClass& Ob)
{
    os<<Ob.a<<'\n';
    return os;
}
Добавлено через 1 минуту
taras atavin, Константная ссылка дает довольно много... В отличии от передачи параметра по значению, передеча параметра по константной ссылке подразумевает во первых неизменение значения, во-вторых передачу только ссылки на объект.
yanyk1n
 Аватар для yanyk1n
4324 / 1455 / 152
Регистрация: 12.03.2009
Сообщений: 5,310
29.12.2010, 13:35     Указатели #17
ForEveR, я вот только не совсем понял этого... А что мешает вернуть указатель на объект os?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
29.12.2010, 13:36     Указатели #18
yanyk1n, Да ничего по сути... Но придеться возвращать тогда по-другому. Разве нет?
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
29.12.2010, 13:38     Указатели #19
Цитата Сообщение от yanyk1n Посмотреть сообщение
А что мешает вернуть указатель на объект os?
Если возвращать по указателю, то его перед использованием нужно будет предварительно разыменовать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.12.2010, 13:38     Указатели
Еще ссылки по теме:

Указатели C++
C++ Указатели
C++ Указатели

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
29.12.2010, 13:38     Указатели #20
Цитата Сообщение от yanyk1n Посмотреть сообщение
А как же возвращение значения по ссылке?
А ты не путай интерфейс со внутренней реализацией. В том числе, если ты сам делаешь динамический контейнер, то и возись с указателями. Возврат же значения по ссылке не имеет ни какого отношения к обеспечению динамичности самого контейнера. Это доступ к элементу, а не организация их множества. Если ты сделал контейнер на указателях, то читать/писать конкретный элемент без изменения именно в этот момент их общего количества можно и по ссылке. Но ты сначала сделай контейнер. А если это чужой контейнер, то тебе достаточно его интерфейса, причём, он может быть сделан на функциях set/get, работающих со значениями.
Yandex
Объявления
29.12.2010, 13:38     Указатели
Ответ Создать тему
Опции темы

Текущее время: 20:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru