Форум: "Прочее";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];
ВнизИщу помощи, как новичок. Найти похожие ветки
← →
AntifreezeeR © (2007-07-31 16:05) [0]Драствуйте програмисты=)Я имею тягу в дэлфи, и хотелось бы узнать, с чего лучше начать изучение дэлфи?Посоветуёте плиз.
← →
Сергей М. © (2007-07-31 16:08) [1]
> имею тягу в дэлфи
Ой...) ..
И сколько "тягловых сил" оная "тяга" составляет, можно ли полюбопытствовать ?)
← →
Elen © (2007-07-31 16:14) [2]
> с чего лучше начать изучение дэлфи?
Имхо с основ Паскаля, а в продолжении изучить ООП.
← →
Ricko_ (2007-07-31 16:37) [3]Изучить ООП, Java и тяга к Delphi пропадёт
← →
Zeqfreed © (2007-07-31 17:13) [4]Изучить ООП в Си и тяга к Дельфи пропадет ;)
← →
Empleado © (2007-07-31 17:23) [5]
> AntifreezeeR © (31.07.07 16:05)
> Драствуйте програмисты=)Я имею тягу в дэлфи
Радикально: Заткни дымоход! Тяга пропадет в прынцыпе.
ПС. Ох уж и злой я сего дня :((
← →
wp2 © (2007-07-31 17:25) [6]с книжки...
← →
Rule © (2007-07-31 17:55) [7]советую изучить С++ а потом можно и джаву, Делфи считаю умирающей, ИМХО, но уверен что многие со мной согласятся.
← →
boriskb © (2007-07-31 17:58) [8]
> Делфи считаю умирающей
Некрофил?
По кладбищу любишь гулять?
← →
wp2 © (2007-07-31 18:05) [9]да нет, Делфи еще будет жить.
ЗЫ. Чего ж заходишь на этот сайт?
← →
alex_*** © (2007-07-31 18:19) [10]
> да нет, Делфи еще будет жить.
Но детей уже никогда ;)
← →
Галинка © (2007-07-31 20:08) [11]Опять меряемся ... генеталиями. Си... Дельфи...
Вот из командной строки под линухом вот это жесть. А придется. И страсть как интересно. Керникану с Ричи надо было Гарри Поттера писать.
По сабжу. Возьми Бакнела "Фундаментальные алгоритмы в Дельфи". Захватывает после третьей страницы.
← →
TStas © (2007-07-31 20:11) [12]Могу посоветовать то же, что и мне посоветовали когда-то:
1. Простой Паскаль.
2. Работа с указателяли.
3. Основы ООП.
Пробовать писать консольки с указателями, структурку какую-то динамическую написать.
← →
alex_*** © (2007-07-31 20:12) [13]
> По сабжу. Возьми Бакнела "Фундаментальные алгоритмы в Дельфи".
> Захватывает после третьей страницы.
Девушка... ну вы блин даете....
← →
Галинка © (2007-07-31 20:28) [14]alex_*** © (31.07.07 20:12) [13]
а что... Книга и правда достойная. Если с паскаля начинать, то книга издательства ДИАЛОГ-МИФИ "Программирование в среде Турбо Паскаль 7.0" отца и сына Епанешниковых. Очень хорошая книга была. Ну и классика жанра "Профессиональное программирование на Турбо Паскале" Файсмана.
← →
TStas © (2007-07-31 20:33) [15]>Галинка © Но если человек только начинает? Ведь, вспомните, как начинали Вы, первая проблема - не запинаясь писать код. Сразу полный Дельфи - много информации слишком. А Паскаль закладывает основы знаний, не перегружая. Ну и указатели... Вот я поначалу никак не мог понять, зачем они вообще нужны :)
← →
Галинка © (2007-07-31 20:47) [16]Начинала я и правда с паскаля. И именно с Епанешниковых и с Файсмана. Списки и указатели как раз у Файсмана очень доходчиво описаны.
Но больше всего мне помогли друзья. Кстати закоренелые Си-сты. И позже уже здесь на форуме много помогали. Ну и хэлп, книги и интересные задания.
← →
TStas © (2007-07-31 20:50) [17]Вот и мне на форуме очень помогли. В первую очередь Юрий Зотов. Он давал краткие, но очень действенные советы. Например, писать консольки с указателями. А правда, как без работы с указателями вообще понять, что такое объект?
← →
Piter © (2007-07-31 20:51) [18]AntifreezeeR © (31.07.07 16:05)
с чего лучше начать изучение дэлфи?
Изучение дельфи сейчас лучше начинать с Visual C# .NET
← →
Piter © (2007-07-31 20:54) [19]даже не так:
"Изучение дЭлфи сейчас лучше начинать с Visual C# .NET"
← →
alex_*** © (2007-07-31 22:36) [20]
> "Изучение дЭлфи сейчас лучше начинать с Visual C# .NET"
>
А еще так я бы сказал - изучение программирования лучше начинать с Visual C# .NET :) и там куда кривая выведет
← →
ElectriC © (2007-08-01 00:47) [21]
> "Изучение дЭлфи сейчас лучше начинать с Visual C# .NET"
LOL
← →
Галинка © (2007-08-01 11:33) [22]Проповедники дотнет, виндой к сожалению (а может и к счастью) программирование не ограничивается.
ТСтас, я не поняла про связб работы с указателями и пониманием объектов. Указатели не только для ООП нужны.
Короче по сабжу. Бакнел однозначно. Чтобы потом не переучиваться.
← →
TStas © (2007-08-01 11:38) [23]>Галинка © Конечно не только. Но ведь все объекты - указатели. Просто из личного опыта (Только не ржите): Получил я как-то SizeOf(Form1) и думал, а чего это она 4 бита:) Вот мне это место понять не сразу далось.
← →
Игорь Шевченко © (2007-08-01 11:42) [24]C .Net никогда не надо начинать.
← →
Cerberus © (2007-08-01 11:55) [25]
> Zeqfreed © (31.07.07 17:13) [4]
> Изучить ООП в Си и тяга к
программированию пропадает.
← →
wp2 © (2007-08-01 13:23) [26]Не согласен, именно ООП в Си я впервые более-менее понял.
← →
sergeyst © (2007-08-01 13:51) [27]
> Игорь Шевченко © (01.08.07 11:42) [24]
> C .Net никогда не надо начинать.
Почему?
← →
Игорь Шевченко © (2007-08-01 14:16) [28]sergeyst © (01.08.07 13:51) [27]
Вот по этому:
http://local.joelonsoftware.com/mediawiki/index.php/%D0%9E%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BD%D0%B0_Java
← →
Игорь Шевченко © (2007-08-01 14:21) [29]И еще по теме:
http://local.joelonsoftware.com/mediawiki/index.php/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%94%D1%8B%D1%80%D1%8F%D0%B2%D1%8B%D1%85_%D0%90%D0%B1%D1%81%D1%82%D1%80%D0%B0%D0%BA%D1%86%D0%B8%D0%B9
← →
rebroff (2007-08-01 14:58) [30]Прочитал "Основы объектно-ориентированного проектирования" г-на Г. Буча-сознание дало резкий крен в сторону С++. Ни Пачеко ни Стивенс уже не помагают. Памажите!!!!
← →
Галинка © (2007-08-01 17:18) [31]Тогда и мне.
Во-первых, есть ли в природе изветсная на сегодняшний день и доступная (в смысле скачать где-то можно) IDE для Си, который описан у Кернигана/Ричи. В новых иде (и вероятно в их компиляторах) синтаксис неМного отличается. Хочется попробовать процедуральное программирование, но компилятор не хочет принимать код в виде примеров из книги. А как он хочет, я не могу понять. Потому как в нем примеров нет вообще.
Во-вторых, Си и вправду гибче паскаля. В смысле компактнее как то. Правда иногда и запутаннее от этого. Чего только стоит запись в стилеfor (nc = 0; getchar() != EOF; ++nc);
← →
Галинка © (2007-08-01 17:22) [32]"Во-первых, ..." решилось. Таки синтаксис похож на дельфяшный, типа interface, implementation. Сначала называем с модификатором extern, а потом описываем.
← →
Галинка © (2007-08-01 17:57) [33]TStas © (01.08.07 11:38) [23]
неее... друг... Объект, а точнее класс - это набор свойств и методов. Структура данных, так сказать. А указатель, это лишь адрес в памяти, начиная с которого все это храниться. )) Указатели лучше всего ИМХО описаны у Файсмана в разделе про связанные списки. Вот там реально можно понять, зачем вообще указатели придумали.
← →
Kerk © (2007-08-01 18:03) [34]Я не понимаю вообще КАКИЕ проблемы могут возникать с пониманием указателей? Ладно рекурсия для некоторых сложная штука.. но УКАЗАТЕЛИ.. ппц
← →
Галинка © (2007-08-01 18:07) [35]Непонятка тока одна возникает, а зачем они вообще нужны, эти указатели. Есть же переменные, стэк и все такое. Зачем еще и указатели.
А вот хоть в дельфи, хоть в си, можно ли написать функцию, возвращающую несколько значений, не комплаксное типа массива иили записи или структуры, а именно несолько?
← →
Gadenysh (2007-08-01 18:57) [36]
> Галинка © (01.08.07 18:07) [35]
это уже будет не функция.
а процедуры с out - параметрами никто не отменял
← →
Игорь Шевченко © (2007-08-02 10:48) [37]
> А вот хоть в дельфи, хоть в си, можно ли написать функцию,
> возвращающую несколько значений, не комплаксное типа массива
> иили записи или структуры, а именно несолько?
А что на эту тему говорят Керниган и Ричи ?
← →
Algol (2007-08-02 12:06) [38]
> Непонятка тока одна возникает, а зачем они вообще нужны,
> эти указатели. Есть же переменные, стэк и все такое. Зачем
> еще и указатели.
Вот вам и пример вредности джавы ))
> А указатель, это лишь адрес в памяти, начиная с которого
> все это храниться. ))
То что вы описываете, на самом деле является не указателем а ссылкой. Указатель же сам по себе является переменной.
← →
Kerk © (2007-08-02 12:08) [39]> [38] Algol (02.08.07 12:06)
А ссылка не является? Вот чесслово не понимаю разницы между указателем и ссылкой, которую сишники придумали.
← →
Kerk © (2007-08-02 12:10) [40]Это похоже какая-то удобная им абстракция от непонимания того, что не бывает ничего, что само по себе не занимает памяти.
← →
sergeyst © (2007-08-02 12:15) [41]
> Игорь Шевченко © (01.08.07 14:16) [28]
Надеюсь сдохнуть к тому времени, когда начну так же рассуждать. Но со статьей согласен.
← →
Algol (2007-08-02 12:19) [42]
> А ссылка не является?
Указателем? Нет конечно.
← →
Algol (2007-08-02 12:20) [43]
> Это похоже какая-то удобная им абстракция от непонимания
> того, что не бывает ничего, что само по себе не занимает
> памяти.
Если это ты про ссылки, то зря ты так думаешь, уж кто-кто а сишники прекрасно понимают что занимает память а что нет (и кстати я не сишник))
← →
Галинка © (2007-08-02 12:21) [44]Kerk © (02.08.07 12:08) [39]
с сылкой нельзя мат операций производить. Т.е. это просто как Алгол написал. Это обрезанный указатель для "безопасного" кода.
Еще есть подозрение, что ссылка это такая локально-глобальная переменная. т.е. по идеологии Си если переменная передаются значением, то передается не сама переменная, а ее локальная копия. Т.е. если она будет изменяться, то будет изменяться именно эта копия. А если переменная передается адресом (не важно ссылкой или указателем), то работать будешь с оригинальной переменной. И если ты ее изменил, то изменится именно то, что хранится по заданному адресу.
← →
Empleado © (2007-08-02 12:25) [45]
> Kerk © (02.08.07 12:08) [39]
> > [38] Algol (02.08.07 12:06)
> А ссылка не является? Вот чесслово не понимаю разницы между
> указателем и ссылкой, которую сишники придумали.
Тождественно.
Вспоминаю, когда впервые развернул delphi на экране, умные люди мне сказали примерно так "зря ты это, начни лучше с C++: иначе всю оставшуюся жизнь будешь путаться в пойнтерах"
← →
Kerk © (2007-08-02 12:31) [46][42] Algol (02.08.07 12:19)
>> А ссылка не является?
> Указателем? Нет конечно.
А чем она является? Ты мне физический смысл объясни. Мы, старые ассемблерщики, ваши абстракции понимаем с трудом :)
> [44] Галинка © (02.08.07 12:21)
Ну как я и думал. В общем, лишняя сущность.
← →
Галинка © (2007-08-02 12:49) [47]Kerk © (02.08.07 12:31) [46]
ну почему же лишняя? просто она бесопаснее. Сслыка появилась в ООП уже. Она указывает на целостный объект. Например, массив в объектных языках - это объект. Начерное именно поэтому появилась возможность динамических массивов. Хотя массив на уровне "железа" это просто последовательность переменных, и с помощью указателей и арифметических операций с ними и построены все операции с массивом. По-моему так. Если не права, поправьте ))
← →
Kerk © (2007-08-02 12:53) [48][47] Галинка © (02.08.07 12:49)
> ну почему же лишняя?
Ссылка - это ридонли указатель? Так? Значит лишняя :)
Совершенно не вижу смысла вводить дополнительное понятие.
← →
Alx2 © (2007-08-02 12:58) [49]>Kerk © (02.08.07 12:53)
Разница примерно как между "сбегай туда-то, поправь" и "возьму работу на дом" :)
← →
Галинка © (2007-08-02 13:00) [50]Kerk © (02.08.07 12:53) [48]
короче это сущность, созданная для ламеров. Чтоб не порывались сделать недопустимые действия. ))
← →
Algol (2007-08-02 13:17) [51]
> А чем она является? Ты мне физический смысл объясни. Мы,
> старые ассемблерщики, ваши абстракции понимаем с трудом
> :)
Ссылка это второе имя переменной.
С точки зрения компилятора это просто фиксированный адрес по которому находится переменная.
Если ты передаешь в функцию ссылку на переменную, то на самом деле в функцию вообще ничего не передается, а вместо формального параметра подставлется адрес передаваемой переменной, который компилятор знает еще на этапе компиляции.
С указателями же все поисходит совсем не так. Во-первых указатель это рантайм адрес. Ему нужно выделять память, то есть он является переменной. При передаче указателя в функцию, указатель действительно передается, затем при обращении к указателю, он разыменовывается, но в рантайме (а ссылка еще при компиляции). И тд и тп. Короче как на мой взгляд разница между ссылкой и указателем очень даже существенна.
← →
Kerk © (2007-08-02 13:21) [52][51] Algol (02.08.07 13:17)
> он разыменовывается, но в рантайме (а ссылка еще при компиляции)
Разыменование - чисто логическая операция и происходит ВСЕГДА при компиляции.
← →
Галинка © (2007-08-02 13:25) [53]Algol (02.08.07 13:17) [51]
Спасибо. Выссказал то, что я пыталась понять )) Т.е. ссылка это как бы бестелесный указатель. Вот а где можно почитать, как компилятор ссылки понимает?
← →
Kerk © (2007-08-02 13:26) [54][51] Algol (02.08.07 13:17)
> Если ты передаешь в функцию ссылку на переменную, то на
> самом деле в функцию вообще ничего не передается, а вместо
> формального параметра подставлется адрес передаваемой переменной,
> который компилятор знает еще на этапе компиляции.
Ну как же не передается?
← →
Kerk © (2007-08-02 13:27) [55]Либо я чего-то не понимаю, либо одно из двух :)
← →
Kerk © (2007-08-02 13:30) [56]А. Ссылка - это как бы константа, псевдоним какого-то адреса, который при использовании уже во время компиляции всюду проставится? Так?
← →
Algol (2007-08-02 13:30) [57]
> Разыменование - чисто логическая операция и происходит ВСЕГДА
> при компиляции.
Эээ... да ?
Странно.. так по вашему и Access Violation тоже еще на этапе компиляции возникают ?
← →
Kerk © (2007-08-02 13:32) [58]> [57] Algol (02.08.07 13:30)
Access Violation возникает при попытке доступа к невыделенной памяти. При компиляции никаких попыток доступа никуда не происходит.
← →
Algol (2007-08-02 13:32) [59]
> А. Ссылка - это как бы константа, псевдоним какого-то адреса,
> который при использовании уже во время компиляции всюду
> проставится? Так?
Да... как и любое имя переменной :)
← →
Algol (2007-08-02 13:33) [60]
> Access Violation возникает при попытке доступа к невыделенной
> памяти. При компиляции никаких попыток доступа никуда не
> происходит.
Ну так разыменование это и есть "попытка доступа"
← →
Галинка © (2007-08-02 13:33) [61]Алгол, ну скажи же, как передается просто адрес? Без переменной? Действительно хочется понять.
← →
Kerk © (2007-08-02 13:34) [62][60] Algol (02.08.07 13:33)
> Ну так разыменование это и есть "попытка доступа"
Тогда я не понимаю о каком разыменовании в процессе компиляции идет речь.
← →
Kerk © (2007-08-02 13:35) [63][59] Algol (02.08.07 13:32)
> > А. Ссылка - это как бы константа, псевдоним какого-то
> адреса,
> > который при использовании уже во время компиляции всюду
> > проставится? Так?
>
> Да... как и любое имя переменной :)
Теперь понятно. Но все равно можно было обойтись для этого существующими понятиями.
← →
Галинка © (2007-08-02 13:41) [64]Алгол, правильно ли я поняла, что при integer x = 5, х будет указывать на 8 байт, в которых хранится пятерка; а при ArrayList numbers = new ArrayList(), numbers будет так же указывать на область памяти, в которой храниться объект?
← →
alex_*** © (2007-08-02 13:45) [65]
> при integer x = 5, х будет указывать на 8 байт, в которых
> хранится пятерка
жесть какая-то у вас пошла. Про новичка, которому нужна помощь уже забыли
← →
Algol (2007-08-02 13:47) [66]Давайте закончим уже этот офтоп)
> Тогда я не понимаю о каком разыменовании в процессе компиляции
> идет речь.
Вы судите о разыменовании с точки зрения IDE. Которая после какого нибудь ptr^ понимает что речь идет об объекте, на который указывает указатель, высвечивает списочек доступных методов и т.д.
Но это лишь вспомогательная функция оболочки. На сомом деле, компилятор понятия не имеет на объект какого типа будет указывать ptr, и будет ли указывать вообще. Это выяснится только в рантайме, когда произойдет фактическое разыменование...
> Теперь понятно. Но все равно можно было обойтись для этого
> существующими понятиями.
Как же обойтись? Как мне указать программе, что я хочу работать с переменной, внешней по отношению к данной функции?
> Алгол, ну скажи же, как передается просто адрес? Без переменной?
> Действительно хочется понять
Так никакой адрес никуда не передается. Каждой переменной компилятор ставит в соответствие какой-то адрес памяти, где эта переменная будет храниться. Это понятно? После этого, все обращения к данной переменной, он заменяет на обращение к памяти по этому фиксированному адресу. При этом вместо переменной A и вместо всех ссылок на нее, просто устанавливается один и тот же адрес... Что непонтяного ?
← →
Галинка © (2007-08-02 13:47) [67]А можно ли попросить модераторов, чтоб выделили это отдельной веткой? Что-то типа "Отличие указателя от ссылки".
← →
Галинка © (2007-08-02 13:48) [68]Algol (02.08.07 13:47) [66]
понятно. Огромное спасибо.
← →
Игорь Шевченко © (2007-08-02 13:49) [69]А можно попросить аккуратно списать ответы в тетрадочку и не выделять отдельных веток ?
← →
Algol (2007-08-02 13:49) [70]
> Алгол, правильно ли я поняла, что при integer x = 5, х будет
> указывать на 8 байт, в которых хранится пятерка; а при
> ArrayList numbers = new ArrayList(), numbers будет так же
> указывать на область памяти, в которой храниться объект?
Девушка, почитайте какую нить книжку по чем нить простому, типа TurboPascal 7. Не путайте голову никакими объектами и ArrayList.
← →
alex_*** © (2007-08-02 13:50) [71]
> На сомом деле, компилятор понятия не имеет на объект какого
> типа будет указывать ptr
ага, компиляция пройдет и в рантайме программа будет долго искать какой-ть метод GetName() у неизвестного объекта... Про ошибки несоответствия типов при компиляции ты даже не слышал, конечно
← →
Kerk © (2007-08-02 13:55) [72][66] Algol (02.08.07 13:47)
> Но это лишь вспомогательная функция оболочки. На сомом деле,
> компилятор понятия не имеет на объект какого типа будет
> указывать ptr, и будет ли указывать вообще. Это выяснится
> только в рантайме, когда произойдет фактическое разыменование...
Как это не понимает? Тип указателя всегда указывается либо при его объявлении (P: PInteger), либо при преобразовании типа (PInteger(P)).type
PTest = ^TTest;
TTest = record
A: Integer;
B: Integer;
end;
var
P: PTest;
begin
New(P);
P.B := 123; // <-- что-то вроде "mov dword ptr [ebx+4],123" -- вот оно разыменование!
end;
← →
Algol (2007-08-02 14:59) [73]
> Про ошибки несоответствия типов при компиляции ты даже не
> слышал, конечно
Конечно не слышал, куда уж мне)
> Как это не понимает? Тип указателя всегда указывается либо
> при его объявлении (P: PInteger), либо при преобразовании
> типа (PInteger(P)).
Ну да..тип указателя это очень хорошо... Только это не имеет никакого отношения к реальному содержимому указателя. Закоментируй строчку New(P);, запусти программу и посмотри как компилятор умный, и как он хорошо понимает какой объект находится в P (ток оптимизацию не забудь выключить, а то твой код вообще ничего делать не будет).
← →
Kerk © (2007-08-02 15:11) [74][73] Algol (02.08.07 14:59)
> Только это не имеет никакого отношения к реальному содержимому
> указателя.
Содержимое указателя - адрес. И ничего более.
> Закоментируй строчку New(P);, запусти программу и посмотри
> как компилятор умный, и как он хорошо понимает какой объект
> находится в P
В P находится адрес чего-то, что имеет тип, который я указал. Остальное - не проблемы компилятора.
Разыменование - это процесс вычисления адреса, т.е. замена "P.B" на "dword ptr [ebx+4]". И ничего более.
← →
Algol (2007-08-02 15:31) [75]
> Разыменование - это процесс вычисления адреса, т.е. замена
> "P.B" на "dword ptr [ebx+4]". И ничего более.
Ну тут вопрос уже чисто философский, что считать разыменованием. Вы под этим понимаете процесс создания кода, а я - его выполнение. Думаю вопрос исчерпан?
← →
Kerk © (2007-08-02 15:34) [76]> [75] Algol (02.08.07 15:31)
> Ну тут вопрос уже чисто философский, что считать разыменованием. Вы под этим понимаете процесс создания кода, а я - его выполнение
"затем при обращении к указателю, он разыменовывается, но в рантайме (а ссылка еще при компиляции)" (с) Algol
Ага, исчерпан :)
← →
Algol (2007-08-02 15:50) [77]Ну если вас все же смущает моя цитата, то я поясню что я имел ввиду:
При обращении к переменной по указателю, вам необходимо сначала занести адерс переменной в указатель а затем его разыменовать, типа такого:
mov ebx, 0x34a23b5a
...
mov dword ptr [ebx+4],123
При обращении же по ссылке, код выглядет несколько иначе:
mov dword ptr [0x34a23b5e],123
Ну так вот именно промежуточное использование ebx в процессе выполнения программы я и назвал "разыменованием в рантайм".
Так все хорошо ? :)
← →
Kerk © (2007-08-02 15:52) [78]> [77] Algol (02.08.07 15:50)
Хорошо. Собственно с этой нестыковки спор и начался. Теперь понятно, что имелось ввиду.
← →
palva © (2007-08-02 16:01) [79]Ну блин, ужи вянут.
В делфи ссылок нет, насколько я понимаю.
В си++ есть указатели и ссылки.
Ссылка в программе реализуется также как и указатель, то есть это адрес, указывающий на значение. Но синтаксически ссылка в тексте используется не так как указатель. Пример:
#include <stdio.h>
int n;
int *p = &n;
int &r = n;
void main() {
n = 777;
printf("%d %d %d\n", n, *p, r); // 777 777 777
}
Здесь p - указатель, его можно прочитать (это будет адрес), присвоить ему какой-то другой адрес, тогда он будет указывать на другую область памяти. Eго тип int* Указатель разыменуется ЯВНО (звездочкой). *p это целое число.
r - это ссылка. Адрес, который лежит в основе r недоступен для чтения и изменения, поэтому ссылка обязательно должна быть инициализирована. Когда мы пишем r, то получаем не сам адрес, а целое число на которое этот адрес указывает. Ссылка разыменовывается автоматически, поэтому сам адрес и не доступен. Ссылку можно передать в функцию, но это будет передача обычного целого числа.
Ссылка экономит нам звездочки, когда переменная очень часто используется. Но это пример ссылки "в чистом виде" - такое использование очень редко и довольно бессмысленно, поскольку логичнее использовать указатели.
Ссылки придуманы для передачи параметров. Такая передача в чем-то аналогична Var и Const в паскале. То есть вместо числа передается адрес, но внутри функции с ним работают как с числом.
← →
palva © (2007-08-02 16:05) [80]Наверно, плохо объяснил. Лучше изучать это дело на примерах.
← →
Галинка © (2007-08-02 16:12) [81]palva © (02.08.07 16:05) [80]
объяснил нормально. на каких примерах и как изучать? в отладчике код на асме смотреть?
← →
Kerk © (2007-08-02 16:14) [82]> [81] Галинка © (02.08.07 16:12)
Лучше какую-нить книжку по С почитать стоит, я думаю. На асме - это для извращенцев :)
← →
Algol (2007-08-02 16:19) [83]
> palva © (02.08.07 16:01) [79]
А чем это описание отличается от описанного выше?
Или вы хотите сказать что в с++ ссылке можно присваивать РАЗНЫЕ переменные? (спрашиваю, без сарказма, действительно не знаю, потому как я не сишник) Если же это константа, то какой смысл ее передавать функции?
← →
Галинка © (2007-08-02 16:25) [84]Да читаю я. Но про ссылок там нет. Наверное надо еще Страуструпа почитать.
А вот по теме вспомнила еще. Сэджвика "Фундаментальные алгоритмы на Си" (за прваильность названия не ручаюсь). Хорошая книга?
← →
Kerk © (2007-08-02 16:27) [85]> [83] Algol (02.08.07 16:19)
Если ссылке можно присваивать РАЗНЫЕ переменные и при этом их можно передавать в функции, то исчезают отличия ссылок от указателей, ибо слабо представляю реализацию этого на асме (извините уж, что с этим пристал).
← →
Algol (2007-08-02 16:35) [86]
> Kerk © (02.08.07 16:27) [85]
Я тоже так думаю... Но по словам plava "Ссылка экономит нам звездочки"...
Если это действительно так, то я могу согласится, что ссылка в C++(!) - довольно бесполезная штука, этакий синтаксичейский сахар, сомнительный к тому же...
То же что описывал я, именно относится к передаче параметра по ссылке (то есть ref или var).
← →
palva © (2007-08-02 16:42) [87]> Если же это константа, то какой смысл ее передавать функции?
Никакого особого смысла не имеет, вернее смысл ровно такой, как и передача по значению обычной целой переменной. Переменная r, описана как ссылка, но выражение r имеет тип int. Но это не константа. Если меняется n, то изменится и r. И наоборот. Это типа синонима переменной n. Можно передать в функцию адрес ссылки, тогда ссылку можно изменить внутри функции (не адрес, конечно, а само значение)
#include <stdio.h>
int n;
int &r = n;
void fun(int *i) {*i=888;}
void main() {
n = 777;
printf("%d\n", n); // 777
fun(&r);
printf("%d\n", n); // 888
}
← →
Галинка © (2007-08-02 16:48) [88]
> Если же это константа, то какой смысл ее передавать функции?
только тем, что работать будешь напрямую с переменной, а не с ее локальной копией, переданную в эту процедуру.
← →
palva © (2007-08-02 16:50) [89]Но все эти конструкции практически не применяются на практике. Ссылки придуманы единственно ради того, чтобы передавать параметры по ссылке. В чистом си для этого приходится передавать указатель, как выше. А в си++ можно написать так:
#include <stdio.h>
int n;
void fun(int &i) {i=888;} // procedure fun(Var i: Integer)
void main() {
n = 777;
printf("%d\n", n); // 777
fun(n);
printf("%d\n", n); // 888
}
Также можно возвращать значение по ссылке. То есть в функции выделяется память под целое и возвращается ее адрес. Внешняя программа присваивает возвращаемое значение не указателю на целое, а обычной целой переменной. И эта переменная становится как бы ссылкой, но об этом лучше сразу забыть. Это обычная переменная.
← →
Algol (2007-08-02 16:55) [90]
> palva © (02.08.07 16:42) [87]
Правильно я понял, что сишная ссылка места в памяти не занимает, то есть не является переменной?
← →
alex_*** © (2007-08-02 17:06) [91]
> Правильно я понял, что сишная ссылка места в памяти не занимает,
> то есть не является переменной?
>
теперь я не понял. Где же ей обретаться?
← →
Kerk © (2007-08-02 17:07) [92]Как я понял, ссылка - это тупо псевдоним. Что-то наподобие можно с #define делать.
← →
palva © (2007-08-02 17:08) [93]В программе это переменная. Но если спросить ее адрес, то будет тот же адрес, что и у величины, на которую она ссылается. То есть, действительно, места в памяти не занимает.
← →
palva © (2007-08-02 17:17) [94]Что-то я про возврат значения по ссылке вам какую-то чушь написал.
На самом деле, если функция возвращает ссылку, то вызов этой функции можно располагать в левой части оператора присваивания. Вот пример.
#include <stdio.h>
int& fun(int *p) {
return *p;
}
void main() {
int n = 5;
printf("%d\n", n); // 5
fun(&n) = 7;
printf("%d\n", n); // 7
}
← →
palva © (2007-08-02 17:21) [95]
> теперь я не понял. Где же ей обретаться?
Компилятор помнит, что она синоним. А что тут странного, такая же конструкция есть в PHP.
← →
boriskb © (2007-08-02 17:28) [96]
> А что тут странного,
Это еще в PL/I было.
Можно было объявить х:Int и указать что эта же память отводится под y:bin и она же s:str
На первый взляг кажется - "зачем? несовместимость типов рано или поздно гарантирована", на на самом деле бывало очень удобно.
А уж чтоб область памяти могла интепритироваться разными типами - забота программиста
← →
Kerk © (2007-08-02 17:28) [97]В паскале было absolute
← →
palva © (2007-08-02 17:46) [98]> В паскале было absolute
В нынешнем делфи тоже есть. Только в delphi absolute используется для того, чтобы одна и та же область памяти могла интерпретироваться как переменные разных типов. В си для этого тоже можно использовать ссылки:
#include <stdio.h>
char d[4];
int &n=*(int*)d;
void main() {
n = 0;
d[0] = 1;
d[1] = 1;
printf("%d\n", n); // 257
}
Здесь d массив байтов (знаковых), а n целая переменная занимающая то же самое место в памяти.
← →
palva © (2007-08-02 17:55) [99]Бедный AntifreezeeR (((
← →
Kerk © (2007-08-02 17:57) [100]Значит приходим к выводу, что ссылки в С - это аналог паскалевского absolute. Разница только в том, что в паскале нельзя их переприсваивать.
← →
Kerk © (2007-08-02 18:01) [101]> [99] palva © (02.08.07 17:55)
Это кто?
← →
palva © (2007-08-02 18:09) [102]
> Это кто?
Это автор сабжа.
← →
Algol (2007-08-02 18:09) [103]
> Это кто?
Это топикстартер.... Он хотел узнать с чего начинать изучение делфи :)
← →
Kerk © (2007-08-02 18:10) [104]А... да ну его :))
← →
Anatoly Podgoretsky © (2007-08-02 22:46) [105]> Игорь Шевченко (02.08.2007 10:48:37) [37]
Еще интереснее, что об этом говорит математика.
← →
Anatoly Podgoretsky © (2007-08-02 22:48) [106]> Kerk (02.08.2007 12:08:39) [39]
Указатель это переменная хранящая ссылку, а ссылка это само значение адреса, так понятно?
← →
Anatoly Podgoretsky © (2007-08-02 22:51) [107]> Kerk (02.08.2007 13:32:58) [58]
Вот когда вылетишь по AV при компиляции тогда и поймешь, происходит или нет.
← →
Anatoly Podgoretsky © (2007-08-02 22:52) [108]> Галинка (02.08.2007 13:33:01) [61]
@имя
$FFFF0
← →
Anatoly Podgoretsky © (2007-08-02 22:54) [109]> Галинка (02.08.2007 13:47:07) [67]
Об этом надо было думать раньше, а не называть тему как "Ищу помощи, как новичок."
← →
Галинка © (2007-08-03 11:58) [110]Anatoly Podgoretsky © (02.08.07 22:54) [109]
тема не моя. Просто как-то к слову пришлось. Вот и начали обсуждать указатели и ссылки ))
← →
Anatoly Podgoretsky © (2007-08-03 16:06) [111]> Галинка (03.08.2007 11:58:50) [110]
Да ладно, все равно нет одназначности, особенно при межязыковом сравнение.
Страницы: 1 2 3 вся ветка
Форум: "Прочее";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];
Память: 0.75 MB
Время: 0.046 c