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

Вниз

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

 
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]

Наверно, плохо объяснил. Лучше изучать это дело на примерах.



Страницы: 1 2 3 вся ветка

Текущий архив: 2007.09.02;
Скачать: CL | DM;

Наверх




Память: 0.65 MB
Время: 0.023 c
15-1185581224
Nic
2007-07-28 04:07
2007.09.02
Задержки зарплаты


2-1186384703
DmitryFox
2007-08-06 11:18
2007.09.02
Локализация приложения для Китая


2-1186761790
denewb
2007-08-10 20:03
2007.09.02
Comparing signed and unsigned types - widened both operands


2-1186561409
Кирей
2007-08-08 12:23
2007.09.02
Кфму 5


8-1164779407
Vulix
2006-11-29 08:50
2007.09.02
Прозрачное окно, созданное с помощью CreateWindow