Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.63 MB
Время: 0.042 c
2-1186671094
Я, снова я
2007-08-09 18:51
2007.09.02
Можно ли запустить процедуру зная ее название?


1-1182796225
d_oleg
2007-06-25 22:30
2007.09.02
IMethodHandler - параметры?


2-1186919229
Lavrenty
2007-08-12 15:47
2007.09.02
Подключение к сети


2-1186934620
Arx
2007-08-12 20:03
2007.09.02
Вопрос по ООП


2-1186828495
Снова я
2007-08-11 14:34
2007.09.02
Сокеты и слияние команд





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский