Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1186455380
Slider007
2007-08-07 06:56
2007.09.02
С днем рождения ! 7 августа 2007 вторник


15-1186164819
guestfromwww
2007-08-03 22:13
2007.09.02
как уничтожить пункт в меню.


2-1186317369
poroshm
2007-08-05 16:36
2007.09.02
Tedit


2-1186655093
DINOEL
2007-08-09 14:24
2007.09.02
Как в памяти хранить таблицу из 5 колонок?


15-1186368312
Slider007
2007-08-06 06:45
2007.09.02
С днем рождения ! 6 августа 2007 понедельник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский