Форум: "Прочее";
Текущий архив: 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