![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Для чего нужны указатели и как ими пользоваться? В каких случаях нужно их использовать, а в каких - нет?
P.S. Я этот вопрос задал не от того, что не искал. У меня есть учебник по C++, но там об этом ничего не написано. |
|||
|
||||
gepard |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2477 Регистрация: 29.2.2004 Репутация: 2 Всего: 40 |
Два указателя: на память(хранит адрес) и на значение. Нужны для того, чтобы указывать
![]() -------------------- Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным! © Я, Берсерк, что значит - Неистовый. |
|||
|
||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Гениально.
![]() ![]() А понормальней объяснить можно? Пример привести можете? (особенно желательно пример работы со строками с применением указателей). Это сообщение отредактировал(а) sim7 - 2.8.2005, 16:37 |
|||
|
||||
ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
В поиск батенька, в FAQ здешнее. Всё уже давно описано.
|
|||
|
||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
У меня почему-то FAQ вашего сайта не отображается.
![]() |
|||
|
||||
comcon1 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Пользоваться так:
Если указатель на начало массива:
|
||||
|
|||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
А можете привести пример работы со строками?
|
|||
|
||||
kometa_triatlon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 2 Всего: 6 |
sim7
Указатель на что-то нужен чтобы с этим чем-то работать. Проход по массиву тебе уже показали, часто используются при работе с объектами, при передаче параметров по указателю и т.д., то есть чтобы не тратить лишнюю память. Учись дальше и все поймешь, твой вопрос из разряда "зачем нужны массивы"... -------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
|||
|
||||
ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
||||
|
||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Спасибо.
![]() ![]() |
|||
|
||||
CoreDumped |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 1.8.2005 Репутация: нет Всего: 1 |
Ну конечно всё что нельзя сделать без указателей можно сделать при помощи переменных ссылок. Кстати в дочернем языке от микрософт с# нет указателей.
Ну а так можно отметить что функция в языке с или с++ возвратить может только одну переменную и что делать если таких переменных две, три, пять... сто...? Правильно использовать указатели (ну или ссылки). А после выполнения функции использовать указатель как надо. вот пример:
Кстати библиотека stl ох как не может существовать без указателей. Ведь итераторы в приметивном своём виде это и есть указатели (ну а не в приметивном классы ![]() Это сообщение отредактировал(а) CoreDumped - 3.8.2005, 08:07 |
|||
|
||||
ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
Ни одна серьёзная библиотека/программа/функция даже не может существовать без указателей. |
|||
|
||||
comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Залезь в соседнюю тему, где чувак корячится с двухмерным массивом. Посмотри, как он обращается к элементам, и как я.
|
|||
|
||||
Chaos A.D. |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 172 Регистрация: 16.1.2005 Где: 09 RUS Репутация: 6 Всего: 7 |
Если все еще остались темные пятна в использовании указателей, почитай мою, хм, "статью" тут. Писал я её давно. На тот момент у меня за плечами не было и полугода программирования. И поэтому сейчас можно очень много всего добавить и подправить. Об одних только указателях на функции-члены и приведении типов в стиле C++ можно столько понаписать.. Но тебе, как начинающему, хватит.
--------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest |
|||
|
||||
LPBOY |
|
||||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Chaos A.D., статья отличная, но есть парочка неточностей...
По Стандарту здесь ошибка. Все что ты расписал ниже(в статье) относится скорее к const int & r = 12; Кстати тут мне вспомнился очень поучительный пример:
,но
ИМХО, только снимает, но не устанавливает константность. Это сообщение отредактировал(а) LPBOY - 3.8.2005, 12:24 --------------------
Каждый человек по-своему прав, а по-моему нет... |
||||||||||
|
|||||||||||
Chaos A.D. |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 172 Регистрация: 16.1.2005 Где: 09 RUS Репутация: 6 Всего: 7 |
По поводу int &r = 12 - во времена написания статьи я пользовался только компилером Borland C++ 5.6, поэтому там оно работало. Естессно, что Borland-у до стандарта очень далеко...
На счет только снимает, но не устанавливает константность: Eсли ты выполнишь
Это сообщение отредактировал(а) Chaos A.D. - 3.8.2005, 14:17 --------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest |
|||
|
||||
LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Да, со вторым замечанием я видимо поспешил, сорри... Просто я о таком никогда не слышал.
Просмотрел несколько книг (в том числе Страуструпа) нигде не встретил упоминания, что const_cast может устанавливать константность (говорилось только о снятии константности), но и опровержения этому также не встретил... Но предназначение const_cast все-таки в снятии константности. Это сообщение отредактировал(а) LPBOY - 3.8.2005, 15:48 --------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Chaos A.D., статья, может быть, и хорошая, но я, к стыду своему, все равно ничего не понял...
Я одного не могу понять. Зачем программе работать с адресами переменных, а не с самими переменными (для этого ведь и существуют указатели и значки амперсанда, верно?). Кстати, еще непонятно, какая разница между указателями и "взятием адреса" через использование амперсанда (&)... |
|||
|
||||
Earnest |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
В "библии" рыться не буду, уж больно толста ![]()
Хотя, видимо, написать приведение к не-конст-типу можно, но смысла большого в этом нет. -------------------- ... |
||||||
|
|||||||
LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
sim7, тебе нужен хороший учебник. ИМХО самый лучший учебник - учебник С. Липпмана.
Верней у него их даже два. Один - огромная книжка где почти весь С++ описан во всех подробностях и все хорошо разжевано. (В инете ее легко найти). Вторая книжка небольшая, но написана для совсем начинающих, в инете видел только на англ. яз. ![]() --------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
А я что-то не нашел... Ее можно через инет скачать? Дайте ссылку, если можно... Прямую ссылку на файл, желательно. |
|||
|
||||
LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
--------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Я ее грузил уже, оказывается... Там я еще больше ничего не понял, потому что там структура какая-то нездоровая. Начинает изучение языка с классов. Что-то у него там не то, там я еще больше не разобрался.
Может, дадите ссылку на учебник "стандартной" структуры (но для новичков, конечно)? |
|||
|
||||
LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Читай с третей главы!!!
--------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Понял, больше ссылок вы не знаете.
![]() |
|||
|
||||
chipset |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Читай Дейтела.
--------------------
|
|||
|
||||
LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
--------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
![]() ![]() |
|||
|
||||
chipset |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
В другом ревью оно highly recommended: http://accu.org/bookreviews/public/reviews/c/c002311.htm
--------------------
|
|||
|
||||
En_t_end |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
Давай попорядку ![]() Программа не работает с адресами. Программа - это набор управляющих команд системе. Система, читая твою программу, будет в случае наличия команд управления адресами с ними и работать. Указатели изначально создавались для ускорения работы и оптимизации работы с ОЗУ. Попробую обьяснить на примере... у тебя есть класс Foo. Ты создал обьект Foo foo; Допустим класс Foo очень сложен и громоздок. Обьект foo занимает много памяти и поэтому в таком случае:
Приложение уйдет в лучшем случае в глубокий даун, а в худшем при нехватке памяти аварийно завершиться. Для не NT систем может также наблюдаться нарушение целостности памяти других процессов. Почему это происходит ? на строчке somefunc(foo); система делает ещё одну копию foo и поэтому, при условии, что создание первого обьекта от Foo завершилось успешно, не факт, что памяти хватит под второй. Также в этом примере мы не можем изменить уникальный foo в функции somefunc. Максимум, что мы можем сделать - это изменить его клона. Теперь пример, как бы можно сделать это правильно:
В этом примере, что наглядно, используется способ передачи параметра функции по ссылке. В данном случае клон foo не создается, а работа ведется с единственным foo, вернее с указателем на обьект класса Foo, значение которого в результате работы строчки somefunc(&foo) будет адрес foo. В данном примере мы можем работать с уникальными членами foo. Допустим мы можем так изменить public член something(int): lpfoo->something = 1; Ссылка - Адрес - Указатель... это вещи тесно взаимосвязанные в контексте C++. Адрес - это, если по простому - положение обьекта в памяти. Символ & обозначает взятие адреса. Указатель можно воспринимать, как тип способный хранить адреса на определенно типированную переменную. Указатель по сути не нужен будет, если он не ссылается на какой-то обьект памяти по определенному адресу. Чтобы узнать этот адрес, надо "взять адрес" - это логично. |
||||||
|
|||||||
comcon1 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Это тот пример, который нужен. Стоит добавить, что в С это единственный способ передавать функциям переменные с тем, чтобы они изменялись внутри функции.
В С++ есть еще ссылки. Вот так с ссылкой тот же пример.
Для таких целей как раз использовать удобнее ссылки.
Да. Тока слово ссылки стоит применять в контексте к ссылкам, а чтобы термины не путались - бери в кавычки. |
||||
|
|||||
En_t_end |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
Угу моя ошибка, извиняюсь. ![]() |
||||
|
|||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Неправильно. Это то же самое ревью, только о другой книге Дейтелов. Понятно? ![]() Добавлено @ 19:17 En_t_end, из вашего (кстати, вполне хорошего) объяснения я уяснил одно: лучше всегда пользоваться ссылками, а не указателями. Я все правильно понял? Что такое ссылка, я, в принципе, разобрался. |
|||
|
||||
En_t_end |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
sim7
Все зависет от конкретного примера. Допустим примение указателей - это пожалуй единств. выход в контексте C++ работать с кучей. Единственно удобный универсальный вариант работы с массивами в контексте функции при передачи его в виде параметра.
Это сообщение отредактировал(а) En_t_end - 6.8.2005, 10:49 |
||||
|
|||||
comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Работа со ссылками не столь разнообразна, сколь с указателями. Там много ограничений. Например список объектов не может быть реализован с помощью ссылок, ведь ссылкам должны передаваться реальные объекты.
+ указателей в том, что отведенная память сохраняется при удалении указателя, а, следовательно, она доступна из любой области видимости. Однако это и является их минусом, потому что в кривых руках память забывают отводить и это приводит к утечкам (потере указателей на отведенную память). |
|||
|
||||
En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
comcon1
Я думаю это их минусом не является. Это является минусом обладателя кривых рук ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |