|
5 / 5 / 2
Регистрация: 02.03.2011
Сообщений: 40
|
|
Понять указатели:)10.03.2011, 13:35. Показов 11371. Ответов 55
Метки нет (Все метки)
Добрый день!
Совсем недавно начал изучать С++, в основном по методичке, выданной в ВУЗе и по нескольким книгам (Страуструп Б., Стефан Дэвис) и плюс то, что нахожу в интернете. Практически, всё это привязано к ряду лабораторных и контрольных, которые необходимо сделать. Дошел до указателей....О_о. Проблема вот в чем: те практические примеры, которые показывают использование указателей, не отвечают на вопрос - зачем? То есть, все что сделано в этих примерах с помощью указателей, можно сделать и без них, и нельзя сказать, что это будет сложнее. Из-за этого очень трудно понять смысл указателей и они для меня пока что пустая абстракция . Есть ли какие-нибудь простые практические примеры, показывающие... почему без указателей не обойтись? Например, очень легко практически объяснить суть цикла или там функции.
0
|
|
| 10.03.2011, 13:35 | |
|
Ответы с готовыми решениями:
55
Указатели не могу понять Не могу понять зачем нужны указатели? Строки (массив char), указатели. Не могу понять логику! Help! |
|
293 / 14 / 3
Регистрация: 21.12.2010
Сообщений: 293
|
|
| 10.03.2011, 13:55 | |
|
Указатели используют для динамического выделения памяти. Ну вот например, есть у Вас какой-либо объект представленный структурой, а сколько этих объектов не известно, т.е. массив использовать нельзя. Вот тут-то и приходят на помощь указатели.
Допустим тебе необходимо из функции массив вернуть, или наоборот в функцию массив из 1000000 float'ов передать. Через параметр - накладно. Нудо использовать указатель на массив. Указатели вещь нужная, так что лучше хорошо с ними разберись
0
|
|
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
||||||
| 10.03.2011, 13:59 | ||||||
2
|
||||||
|
5 / 5 / 2
Регистрация: 02.03.2011
Сообщений: 40
|
|
| 10.03.2011, 14:24 [ТС] | |
|
А что делает эта программа? Что такое swap?
0
|
|
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 10.03.2011, 14:29 | |
|
Swap обменивает переменные местами. Суть в том, что без использования указателей совершить действия над переменными вызывающей функции внутри вызываемой невозможно, поскольку при передаче параметров в функцию их значения копируются в собственные локальные переменные этой функции и все действия совершаются над ними. Когда же мы передаём адреса, то вызываемая функция может работать с теми же значениями, что и вызывающая, и все изменения будут происходить над реальными переменными, а не над их копиями. В данном случае image_swap принимает значения, и, хотя в функции обмен переменных произошёл, сами переменные в вызывающей функции (main) остались неизменными, поскольку в image_swap происходил обмен местами лишь копий реальных значений. В real_swap же на вход идут адреса, а через них мы получаем доступ к оригинальным переменным, которые и меняем местами. В main после вызова real_swap значения действительно поменялись.
2
|
|
|
Freelance
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
|
|
| 10.03.2011, 14:31 | |
|
1
|
|
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 10.03.2011, 14:33 | |
|
А мы что, говорим о ссылках?
0
|
|
|
Freelance
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
|
|
| 10.03.2011, 14:35 | |
|
0
|
|
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 10.03.2011, 14:37 | |
|
Как бы да. Но если человек не прошёл ещё указатели, о каких ссылках речь? Некоторые конечно дают сначала ссылки, строки, массивы, а потом указатели, но, ИМХО, это неверный подход.
P.S. Я понимаю, вы констатируете факт - возможно. Спасибо, я тоже об этом помню. Но в данный момент нас интересуют указатели и их возможное применение.
0
|
|
|
5 / 5 / 2
Регистрация: 02.03.2011
Сообщений: 40
|
||||||
| 10.03.2011, 14:47 [ТС] | ||||||
|
Спасибо!
Пытаюсь разобраться... Наверное, у меня еще слишком большие пробелы в теории ![]() С printf и scanf еще не знаком, я так понял, это тоже функции ввода-вывода (кстати, почему компилятор ругается на scanf?) . scanf("%d", &a) - это читает десятичное целое и - &a - что это? Наверное, почти такой же пример приведен в методичке:
0
|
||||||
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 10.03.2011, 15:25 | |
|
Да, пример точно такой же. Можете с принтэф/сканэф не заморачиваться пока, раз на плюсах пишете. А что вам конкретно в этих примерах не понятно?
0
|
|
|
9 / 9 / 4
Регистрация: 04.03.2010
Сообщений: 40
|
|
| 10.03.2011, 15:59 | |
|
Я только перетек с Delphi на C++( вернее начал перетекать
). Читая книжку по С++ столкнулся с такой же проблемой, было сказано, что такое указатели, но зачем они нужны не объяснялось, и это осталось для меня загадкой.И , о чудо, зайдя на форум, наткнулся на эту тему, которые уж было сам хотел создавать ![]() Теперь до меня вроде дошло, для чего нужно использование указателей ![]() Итак (если что, поправьте ): 1) В случае использования передачи параметров в виде переменных, аргументам функции присваивается значение передаваемых переменных, тем самым создавая новые переменные, область видимости которых - функция. И меняются значения созданных внутри функции переменных, а значения переменных, передаваемых аргументами никак не изменяется, ибо они лишь однажды передали свои значения для переменных функции. 2) Когда используются указатели в качестве аргументов, аргументы функции принимают не численное значение передаваемых переменных( в данном случае a и b ), а ссылку на ячейки памяти, содержащих значение этих переменных, и внутри функции орудуют уже не новыми переменными, а значениями, хранящимися в адресах, принимаемых в качестве аргументов. Но у меня остался другой вопрос по этой теме: при создании экземпляра класса в чем разница между использованием указателя и простым созданием объекта? Это связанно с стеком и кучей? Если да, то каким образом?
1
|
|
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 10.03.2011, 16:08 | |
|
Да, про формальные и фактические параметры вы всё правильно поняли.
Теперь второй вопрос: если вы имеете ввиду, в чём разница между динамическим выделением памяти под объект с помощью оператора new и работой с этой памятью через указатель на объект данного типа и простым созданием объекта - то разница такая же, как и между созданием статического и динамического массива - один создаётся в стеке и автоматически уничтожается, второй - в куче и освобождаться должен пользователем.
1
|
|
|
40 / 38 / 5
Регистрация: 22.01.2011
Сообщений: 670
|
|
| 10.03.2011, 16:16 | |
|
и дополню. при создании указателя выделяется всегда 4 байта (32-я система), а при создании обьекта выделяется память, в зависимости от типа обьекта. Указатель можно переназначить на другую переменную, а имя обьекта нельзя.
0
|
|
|
5 / 5 / 2
Регистрация: 02.03.2011
Сообщений: 40
|
|||||||
| 10.03.2011, 17:14 [ТС] | |||||||
|
Еще раз всем спасибо!!! Многое стало понятно, особенно после поста Feax.
0
|
|||||||
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 10.03.2011, 17:22 | |
|
А вы пытались запустить программу, которую я выкладывал?
0
|
|
|
5 / 5 / 2
Регистрация: 02.03.2011
Сообщений: 40
|
||
| 10.03.2011, 17:31 [ТС] | ||
|
Да, конечно.
Мне просто не понятны подписи к выводу ( с английским плохо): Before image swap In image swap и т.д. Более того, я в том примере, который из моей методички, убирал указатели ( и ссылки), вызывая функцию с параметрами переменных (a и b), и вот это:
но вербализовать, то что делают примеры, я не могу. Наверное, дело в том, что до этого с понятием "памяти" я не сталкивался...
0
|
||
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
||||||
| 10.03.2011, 17:36 | ||||||
2
|
||||||
|
5 / 5 / 2
Регистрация: 02.03.2011
Сообщений: 40
|
||||||
| 10.03.2011, 18:45 [ТС] | ||||||
|
Да, очень наглядно.
Но - чувствую себя полным гуманитарием ![]() .Я думаю, что на этом этапе мне пока не понять - зачем нужны указатели, даже Ваш пример на этот вопрос до конца не отвечает - ведь если реализовать это
![]() Еще раз всем спасибо!
1
|
||||||
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
||
| 10.03.2011, 18:54 | ||
|
Обмен переменных - лишь пример, который показывает, что без указателей в случае, когда в функции надо изменить фактические параметры, не обойтись (про ссылки пока не говорим).
0
|
||
| 10.03.2011, 18:54 | |
|
Помогаю со студенческими работами здесь
20
Не могу понять, как "живут" файловые указатели Указатели и указатели на указатели, а также типы данных Через указатели на указатели посчитать сумму двух чисел и записать в третье Почему Лафоре использует указатели на указатели, вместо обмена значениями указателей? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|