| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Указатели |
| Автор: WolfAlone 28.1.2009, 11:12 | ||
Добрый день! Объясните пожалуйста принципиальное отличие строки 1 и строки 2
Ещё очень хотелось бы узнать, в каких практических случаях применяются указатели, и ссылки. Спасибо! |
| Автор: mrbrooks 28.1.2009, 11:20 | ||
это прикол? |
| Автор: Lazin 28.1.2009, 11:23 |
![]() |
| Автор: WolfAlone 28.1.2009, 11:28 |
| vinter, спасибо огромное! С написанием разобрался окончательно. Вопрос про практическое применение указателей, до сих пор открыт... Так же интересуют ссылки. P.S. Читаю 8ой раз "Руководства идиота по С++", никак не могу въехать в практику их применения... |
| Автор: mrbrooks 28.1.2009, 11:44 |
| Автор: taiven 28.1.2009, 12:35 | ||||||
ну и ещё
|
| Автор: GoldFinch 28.1.2009, 12:42 | ||
забудь про С++ и читай про теорию программирования, в частности про структуры данных и подпрограммы |
| Автор: WolfAlone 28.1.2009, 12:47 |
| Объясните мне кто-нибудь человеческим языком, код написанный выше? Что, куда и зачем... Я уже примерно 7ой раз пытаюсь начать учить С++, и всё упирается именно в эти указатели и ссылки! Даже ассмблер мне так туго не давался, как С++!!! Уже в этом году будет уже наверное 6ой год, как я хочу начать его учить, и ... |
| Автор: Lazin 28.1.2009, 12:49 |
| может не твое? Добавлено через 45 секунд зачем нам пересказывать то, что написано во всех учебниках, возьми нормальный учебник и почитай |
| Автор: GoldFinch 28.1.2009, 14:04 |
| если ты знаеш асм, то вообще непонятно как у тя может возникнуть вопрос об указателях %) |
| Автор: ZeroPoint 28.1.2009, 14:15 | ||
| Вначале был Указатель. Тут немного кода с комментариями, для начала хватит.
|
| Автор: russians 28.1.2009, 14:19 | ||
WolfAlone,
Всё |
| Автор: WolfAlone 28.1.2009, 14:19 |
| Я знаю: javaScript, CSS1/2, HTML4, SQL, Pascal, Basic, PHP, ASM немного, и чё-то там ещё! Может быть конечно не на уровне супер-профессионала, но на достаточно высоком уровне. Такое понятие как указатели - в Pascal'e я использовал только для выделения буферов при работе с файлами, в других случаях обходился обычными переменными. Про ссылки, я ничего ни в PHP, ни в Pascal'e не слышал. Что такое структуры я знаю хорошо, т.к. писал чью-то курсовую, в которой нужно было на паскале соорудить примитивный движек для БД, за основу которого я взял именно структуры. Lazin, после вышесказанного, я всё же смею надеяться, что изучение C++, мне всё таки начнёт удаваться. Главное, что бы кто-нибудь обычным человеческим языком мне растолковал, какое практическое применение у указателей и ссылок! Для чего их применяют и как? Так как из "сухих" книжных понятий мне нихрена не ясно. Спасибо! |
| Автор: russians 28.1.2009, 14:31 | ||
А ты не торопись, возьми Стивена Прата С. С++ тебе пока рано, надо понять сначала его кровного старого собрата, из которого потом С++ родился. Почитай его спокойненько - поймёшь А дальше - усложняй себе задачу по мере прихода понимания Указатель хорош тем, что вместо того, чтобы передавать в функции значения и создавать дополнительные, нафиг никому не нужные локальные переменные, которые жрут место в памяти, мы можем передать в неё указатель, а указатель это всего лишь переменная, которая хранит адрес в памяти (по сути int - по длине), и которую ты можешь разыменовать, т.е. достать значение по адресу с помощью оператора *. Есть у нас массив int x = {1, 2, 3, 4}; И есть у нас переменная int * i = x (в С имя массива - это ссылка на первый элемент массива). Так гораздо легче для памяти, когда мы передаём этот мааааленький указатель и обращаемся к нему: *(i + h), где h - это смещение типа int относительно начального указателя, разыменовывая по очереди элементы относительно первого, на который указывает указатель, чем когда мы передаём весь массив. И когда мы подставляем имя массива в функцию, тем самым мы передаём указатель на первый элемент её. Ещё тебе указатели понадобятся, когда ты узнаешь, что такое malloc, calloc, realloc, free и new/delete (динамическое размещение элементов данных в памяти прямо на ходу выполнения приложения, а не в момент компиляции). И когда ты будешь изучать сложные структуры данных (списки, деревья, стеки, очереди, графы), то тебе указатели пригодятся для связок предыдущих и следующих элементов. Вот, вроде бы объяснил. Поправляйте, если что P.S. А нахрена тебе С++, если тебе нужны указатели? Указатель - это низкоуровневая работа с памятью, это С. |
| Автор: Kurganec 28.1.2009, 14:35 | ||
улыбнуло |
| Автор: GoldFinch 28.1.2009, 15:03 | ||
на крайне низком уровне ты их знаешь, и само программирование тоже подозреваю что такие структуры как списки и деревья, которые обычно реализуются через указатели, тебе неизвестны |
| Автор: WolfAlone 28.1.2009, 16:32 | ||
| russians, спасибо мил человек, век не забуду! Теперь я вроде как понял, шо такое указатели и для чего они нужны. Думаю, практика быстро исправит сложившееся недоразумение Остался ещё небольшой вопрос. Вот мы выделили 4 (или не 4
сделали на него указатель... Судя по написанному в руководстве, функция new int - должна была вернуть мне адрес выделенной памяти, а она мне почему-то возвращает TRUE, видимо по тому, что память удалось выделить, при это ещё выдает такое предупреждение. warning C4800: 'int *' : forcing value to bool 'true' or 'false' (performance warning). Что я не так сделал? |
| Автор: Lazin 28.1.2009, 16:36 |
| |
| Автор: WolfAlone 28.1.2009, 16:38 |
| GoldFinch, вы совершенно правы! Когда я сдавал зачеты по информатике в школе, ещё на агатах - ни я, ни преподаватели информатики, ни видимо сами АГАТы не слышали про такие структуры как деревья и списки - ничего не слышали! Бывает же такое... А вообще, я не утверждаю, что я знаю всё на 5+, но всё выше мною указанное на твёрдое 4 - сдал. В PHP и CSS как ни странно я покачто тоже ничего не слышал про указатели, хотя возможно в них покачто небыло необходимости! Да, и в HTML мне тоже не удалось обнаружить указателей. |
| Автор: GoldFinch 28.1.2009, 16:58 |
| WolfAlone, CSS и HTML - не языки программирования в PHP есть оператор разыменовывания $, через него там указатели и реализуются подозреваю что ваши преподаватели информатики и не такое знали, только вам это не говорили ибо бесполезно в самом деле, почитайте чтонить из теории, например чтонить типа "алгоритмы и структуры данных" Вирта |
| Автор: Goliaf777 28.1.2009, 17:46 |
| У нас преподователи информатики в школе 3 года учат как включать компьютер и запускать ворд а остальные годы как выключать компьютер и закрывать ворд. Так что я подумал лучше буду изучать сам чем эти паскали и бейсики, которые сами преподающие незнают. А вот как посоветовл уважаемый russians тебе стоит почитать С.Прата Язык программирования С++. Лекции и упражнения. Главное понять зачем это нужно, как было сказано выше это позволяет экономить пямять что важно, но не менее важно гибко управлять ею. |
| Автор: WolfAlone 28.1.2009, 18:32 |
| При всём желании, облазив весь PHP.ru - так и не нашёл, ничего похожего на указатель. Точнее будет сказать, слово указатель там конечно присутствует, но в отличии от С++ - в PHP это абстрактное понятие, и в классическом смысле этого слова их там всё же нет. Но давайте всё-таки вернёмся к теме, ведь разговор не о том, есть ли указатели в php или нет. С указателями я наконец-то разобрался, со ссылками кажется тоже въехал что, куда и зачем. Получилось, как обычно "а ларчик просто открывался"... Всем спасибо, думаю тему можно закрывать! А Вам, уважаемы, Goliaf777, хочу высказать искреннюю благодарность! По крайней мере хотя бы за человеческое отношение. Так же выражаю огромную благодарность всем остальным, пытающимся помочь мне с моими глупыми на их взгляд вопросами. P.S. Люди, будьте друг к другу более снисходительны! Ведь все мы когда-нибудь встретимся в другом мире... По сути дела все мы родились от одной матери, и у нас и без того врагов хватает! Так не будем восставать против братьев своих по разуму и всему остальному! |
| Автор: pan2004 28.1.2009, 18:44 |
| WolfAlone, указатели обычно используют в следующих случаях: 1. Когда необходимо установить физические связи между отдельными объектами. Например, создать такие структуры как списки, разнообразные деревья и графы без использования указателей довольно сложно. 2. Для доступа к памяти в области "кучи"(heap) можно только через указатели. 3. Для создания массива заранее неизвестного размера: char* myStr = new char[len]; 4. Для изменяемых аргументов функций - хотя чаще используют здесь ссылки, тк проще. 5. Надеюсь ничего особого не забыл... |
| Автор: WolfAlone 28.1.2009, 18:49 |
| pan2004, спасибо огромное! Теперь я знаю не только как их использовать, но и зачем! Думаю, что тему можно закрывать! |
| Автор: pan2004 28.1.2009, 18:49 |
| 6. Да и в Сиплюс плюс - для реализации динамического полиморфизма(заумно, но это когда указателю на базовый класс присваивается объект производного класса. Если теперь через этот указатель вызвать виртуальный метод, то он будет вызван у производного класса. Так, одна функция может, принимая указатель на Base, вызывать методы любого из Derived классов, в зависимости от конкретного типа передаваемого в эту функцию объекта.) |
| Автор: GoldFinch 28.1.2009, 18:55 |
| указатели нужны чтобы хранить адрес куска памяти вот собственно и все их назначение и применение |
| Автор: mes 28.1.2009, 19:04 | ||
GoldFinch, адрес куска памяти можно хранить и в int`e. Так зачем тогда указатели ? |
| Автор: Goliaf777 28.1.2009, 19:24 |
| mes Потому-что над указателями дйствует (что весьма важно) другая арифметика, Добавлено через 1 минуту и 53 секунды И совсем другие возможности, что в принципе и делает его следующим типом. |
| Автор: GoldFinch 28.1.2009, 19:32 |
| mes, я както привык мыслить категориями асма, для меня что "указатель", что int - все dword |
| Автор: mes 28.1.2009, 21:03 | ||||||
К _созданию_ указатель отношения не имеет.
ага, заметно чуть ли в каждой фразе. Добавлено @ 21:09
ага, и эта особенность позволяет им выполнять роль итераторов для обычных (статических и динамических) массивов. |
| Автор: bsa 29.1.2009, 18:43 | ||
А посмотрю, что ты скажешь, поработав на 64-х битной машине |
| Автор: GoldFinch 29.1.2009, 19:06 |
| 64-х разрядный код все еще неактуален лет через 5-10 все мирно перейдут на 64-х разрядный код, и то что вы будете называть int'ом я буду называть qword'ом Добавлено через 6 минут и 8 секунд кстати, мне что-то кажется что "64-х битная машина" - это неуместное применение термина "бит" |
| Автор: vinter 29.1.2009, 20:12 |
да что вы говорите, как раз таки уже актуален. |
| Автор: Lazin 29.1.2009, 20:48 | ||
таки давно уже актуален, даже на десктопах |
| Автор: GoldFinch 29.1.2009, 21:09 |
| таки на 99% софт 32-разрядный Добавлено через 55 секунд и XP на 99.9% у всех стоит 32-разрядная |
| Автор: Lazin 29.1.2009, 22:26 |
нормальный софт не проблема собрать как под x86 так и под IA-64 у меня 64х |
| Автор: GoldFinch 29.1.2009, 22:39 |
| Lazin, а у кого-то фряха. ну и что? всеравно количество систем с х64 виндой покачто пренебрежимо мало |
| Автор: Lazin 29.1.2009, 22:53 | ||
смотря где, большинство новых компьютеров продаются с 64х битной виндой если-бы ты писал софт который должен крутиться на серверах а не на десктопах, то тебе пришлось бы лет эдак 6 назад столкнуться с 64х битным кодом |
| Автор: bsa 30.1.2009, 13:42 | ||||
Начнем с того, что не надо ничего называть ни вордом, ни двордом, ни квордом. Так как это источник будущих проблем. Например, мне не известно ни одной 64-х разрядной архитектуры, под которой int имеет размер такой же, как QWORD. Под x86_64 он имеет размер 32 разряда, а вот long, size_t и void* - 64. В то же время, под Win64 у long только 32 разряда. Именно из-за таких вещей возникает большинство проблем при портировании 32-х разрядного кода на x86_64, так как некоторые несознательные программисты продолжают тупо делать
|
| Автор: GoldFinch 30.1.2009, 13:54 |
| bsa, просто сейчас начало переходного периода когда было время 16-разрядных систем, int был 16-разрядным, а long 32-разрядным сейчас int 32-разрядный, а long 64-разрядный все повторяется. но учитывая сколько времени занял переход с 16-разрядных систем на 32-разрядные, я думаю что полный переход произойдет оочень не скоро |
| Автор: Lazin 30.1.2009, 15:03 | ||
с такими программистами да, не скоро какая разница насколько это распространено, ты для себя пишешь или для заказчика? если для себя то все понятно, но заказчик может захотеть иметь оба билда |
| Автор: WolfAlone 30.1.2009, 18:55 |
| А для .net имеется разница в 32х или 64х разрядный билд? |
| Автор: Lazin 30.1.2009, 21:51 |
| нет |
| Автор: bsa 2.2.2009, 17:05 | ||
Переход уже произошел - уже все наиболее популярные ОС имеют 64-х разрядные варианты. Просто, в отличие от 16->32, этот переход не потребовал радикального изменения операционных систем, поэтому ты ничего и не заметил. Кстати, простая перекомпиляция программы под 64-х разрядную ОС выявляет много ошибок, которые в 32-х битном режиме из-за ряда "совпадений" ошибками не являлись. |
| Автор: NightmareZ 3.2.2009, 05:29 | ||
Ты либо врёшь, либо ужасно заблуждаешься. Я думаю, твои познания перечисленных ЯП не выше 1 по пятибальной системе. |
| Автор: Goliaf777 5.2.2009, 21:24 | ||
Половина таких книг, что-то из жанра для чайнегов или идиотов толком незнакомят с языком. Чиатал как-то было в самом начале пути книгу, С++ для чайнеков, нечего не понял, хотел уже поконцить с этой затеей. Сейчас с улыбкой вспоминаю как там на 5 страницах (наивно надеясь что-то обьяснить) обьясняли классы,конструкторы, деструкторы. Поэтому по моему все эти за 21 день, за 24 часа, для чайнеков бурда))) |
| Автор: Riddik 5.2.2009, 21:52 | ||||||||
| Прошу пояснить, верно ли утверждение: Двумерный массив и указатель на массив - одно и тоже.
Добавлено через 7 минут и 39 секунд И
Отличается от
только тем, что во втором случае размер матрицы, которая растёт из такой структуры данных, как указатель на указатель сразу задаётся число столбцов (или размер строки, что одно и то же)? Аналогично объявление двумерного массива (или указателя на массив)
позволяет варьировать число строк, а не определяет это число заране(int a[5][10];), так? Или всё это бред и я ничего не понял? |
| Автор: mes 5.2.2009, 23:16 |
Имхо, Вы не поняли главного, разницу между массивом и указателем. |
| Автор: Riddik 5.2.2009, 23:29 |
| Разница такова: указатель можно перенаправить, укзатель может указывать в никуда, в то время как массив всегда "намертво" указывает на первый элемент, т.е. имя массива - это ещё и адрес его нулевого элемента. Поправьте меня, пожалуйста. В чём ещё отличие указателя от массива? И мой предыдущий пост, где там ошибки? |
| Автор: bsa 6.2.2009, 11:13 | ||
двумерный массив это именно двумерный массив. То, что существует преобразование к указателю на одномерный массив (размером с количество столбцов двумерного), это еще не значит, что это одно и тоже. Более того, операция sizeof для массива и указателя возратит в подавляющем большинстве случаев разные значения. Поэкспериментируй. |
| Автор: Riddik 6.2.2009, 13:57 |
| Спасибо)) |