Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.02;
Скачать: CL | DM;

Вниз

Ищу помощи, как новичок.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.77 MB
Время: 0.024 c
15-1186394190
palva
2007-08-06 13:56
2007.09.02
Снимок дня


15-1185973165
TStas
2007-08-01 16:59
2007.09.02
Компонент TNMHTTP


4-1173440828
dzuev
2007-03-09 14:47
2007.09.02
usb - порт и принтер


1-1182725258
ssa
2007-06-25 02:47
2007.09.02
Как заменить выделенный текст в memo?


15-1186037340
iXT
2007-08-02 10:49
2007.09.02
Вопрос по сетке.