Форум: "Основная";
Текущий архив: 2003.10.20;
Скачать: [xml.tar.bz2];
Вниз
Ссылки и указатели. Найти похожие ветки
← →
Alesha aka Pokemon (2003-10-08 12:32) [0]Подскажите пожулйста что есть ссылки и указатели и чем они отличаются ?
← →
Palladin (2003-10-08 12:35) [1]термин "ссылки" обычно употребляют применительно к WWW
а указатели обычно применяют к числу - которое означает адрес в памяти... тоесть как бы указывает на него...
← →
mike.dld (2003-10-08 12:38) [2]в паскале ссылок, это относится к си
← →
Анонимщик (2003-10-08 12:38) [3]Palladin
Т.е. это одно и то же, что ли?
Значит, @P и P^ - одно и то же?
Ну и педагогов же на этом форуме.
← →
mike.dld (2003-10-08 12:38) [4]в смысле, что вопрос нужно задавать не на этом форуме, а на сишном
← →
ZrenBy (2003-10-08 12:41) [5]http://www.sql.ru/forum/actualthread.aspx?bid=21&tid=48936
← →
Palladin (2003-10-08 12:43) [6]
> Анонимщик © (08.10.03 12:38) [3]
ты не согласен с тем что
а термин "указатель" обычно применяют к числу - которое означает адрес в памяти... тоесть как бы указывает на него... ?
← →
Анонимщик (2003-10-08 12:52) [7]Palladin
Из твоего ответа человек, который спрашивает, может вообразить что угодно. Вот я и вообразил, чем не вариант? Твой ответ совершенно некорректен.
← →
Anatoly Podgoretsky (2003-10-08 12:56) [8]Указатель он на что то указывает
ссылка на что то ссылается
Ну и как?
← →
Юрий Зотов (2003-10-08 13:02) [9]> Анонимщик © (08.10.03 12:38) [3]
> Значит, @P и P^ - одно и то же?
Нет, конечно. @P - это адрес, по которому расположена переменная P, причем сама эта переменная может быть любого типа. P^ - это содержимое памяти по адресу, который содержится в переменной P, причем сама эта переменная должна быть типа "указатель". Если он типизированный, то компилятор сам знает, как ему надо трактовать это содержимое, а если нетипизированный, то компилятору надо об этом сообщить (например, приведением типа).
Пример. Пусть мы имеем такой кусок кода:
var
I: Integer;
P: Pointer;
begin
I := 27;
P^ := I;
И пусть переменную I компилятор расположил в памяти по адресу, например $C8E6F4D2. Тогда выражение @I даст $C8E6F4D2 (и это же число будет содержать переменная P), а выражение Integer(P^) даст 27 (и это же число будет содержать переменная I).
← →
Palladin (2003-10-08 13:02) [10]вот пусть он сначала вообразит, а потом пойдут вопросы примеры и уточнения... это называется учить человека думать и делать выводы, направлять его мысли в правильное русло при множественном выборе вариантов... не нужно говорить ответ, нужно к нему подводить...
я догадываюсь как ответил бы ты
p:pointer - указатель
i:integer - не указатель
g:integer - не указатель
p=@i; теперь p указывает на i
g:=integer(p^) - теперь g равно i
только вот об истинной природе указателя это ничего не говорит...
← →
Digitman (2003-10-08 13:15) [11]
> Alesha aka Pokemon
по сути эти два термина - одно и то же
есть, конечно, определенные ситуации и/или механизмы (относящиеся к процессу компиляции и исполнению кода приложения), когда следует разделять эти два термина по назначению/использованию, но суть от этого не меняется : и "ссылка" и "указатель" ведут к понятию "адрес местонахождения в памяти" чего-либо
пример "родства" терминов :
1) говорят - "формальный параметр подпрограммы объявлен как передаваемый по ссылке" или "фактический параметр подпрограммы передается по ссылке"
это означает, что в ходе работы программы в данную подпрограмму при ее вызове фактическим параметром будет неявно передаваться указатель на местоположение (адрес) этого параметра в памяти программы; указатель этот расчитает компилятор
2) говорят - "формальный параметр п/программы объявлен как типизированный/нетипизированный указатель" или "фактический параметр п/программы является типизированным/нетипизированным указателем"
это означает, что в ходе работы программы в данную п/программу при ее вызове будет явно передаваться значение, равное
адресу местоположения в памяти программы чего-либо, что требует обработки тем или иным образом внутри п/программы; компилятор здесь лишь проверяет соответствие типов формального и фактического параметров, как правило возлагая ответственность за расчет фактического передаваемого значениия указателя (адреса) на программиста
← →
Анонимщик (2003-10-08 13:23) [12]Digitman
Вот это намного лучше, почти пятерка.
Palladin
Ты неправильно догадался
← →
Palladin (2003-10-08 13:24) [13]
> Ты неправильно догадался
я только рад
← →
Digitman (2003-10-08 13:27) [14]
> Анонимщик
ишь ты !) "оценщик")))
← →
Анонимщик (2003-10-08 13:48) [15]Digitman
Да ладно тебе; а сказал я "почти", потому что вопрос и ответ не так плоски, как могло бы показаться сначала. Жаль, нет при себе Майерса, из него можно целую главку о нюансах процитировать (в которой более подробно описывается твой ответ).
← →
Chlavik (2003-10-08 13:59) [16]
> var
> I: Integer;
> P: Pointer;
> begin
> I := 27;
> P^ := I;
а на что тут P указывает ? Тут будет Access Violation По нему же память не выделена...
← →
pasha_676 (2003-10-08 14:13) [17]
> Тут будет Access Violation По нему же память не выделена...
Как не выделена? Переменная объявлена. Ссылке нужна память в длину адреса и не больше. Ссылка содержит адрес, а не данные.
Другое дело что Operator not applicabel to this operand type - но это хохма компилятора. Чтоб ее обойти надо в ссылку положить адрес P:=@I или объявить P как ссылку на интеджер (^integer). Может быть еще можно и параметры компилятора изменить, но я честно признаюсь что не знаю как.
← →
Chlavik (2003-10-08 14:16) [18]
> Ссылка содержит адрес, а не данные.
Ну так P:=$4 одно, а P^:=4 это другое
← →
TButton (2003-10-08 14:23) [19]прочитал. узнал много нового. спасибо.
← →
pasha_676 (2003-10-08 14:25) [20]На самом деле новички часто путаються в ссылках и в работе с ними (да и не только новички, любого может заклинить при навароченности). Если сидеть на Си, то тут доходит очень быстро (как только приспичит реализовать функцию с двумя возвращаемыми параметрами). На паскале эта трудность обходиться средствами самого языка. И ссылки везде в классике примеров паскаля используються для создания связанных списков (в совр. дельфи часто можно их использование обойти динамическими массивами). Однако если заниматься програмингом через выньАПИ или многие другие си-написанные вещи (длл, директ да мало ли что) - то актуальность ссылок опять всплывает. Знать их надо!
Имхо, мне кажется работу с ссылками лучше всего объяснять на низком уровне (практически на асме) - как косвенную адресацию. Во всяком случае как только до меня дошло что ссылка есть собственно способ организовать косвенную адресацию - так сразу я во все врубился :).
← →
pasha_676 (2003-10-08 14:31) [21]
> Ну так P:=$4 одно, а P^:=4 это другое
Это да. Но на размер памяти занимаемой ссылкой не зависит от размера структуры на которую она указывает.
Т.е.
при P^:=I (i - integer)
и P^:=SuperMassivIsMillionaStrok
P по размеру будет одинаковая (сколько не помню - но вроде ворд) и даже значения P в обоих случаях может быть одинаковое. Ссылка суть переменная содержащая адрес и не более того.
← →
nikkie (2003-10-08 14:40) [22]>pasha_676
вроде все правильно понимаешь, только почему-то выводы неправильные :(
AV действительно наиболее вероятный исход. вероятно, случилась опечатка и следует читать P := @I; вместо P^ := I;
>Чтоб ее обойти надо в ссылку положить адрес P:=@I
что ж это изменит?
← →
Плохиш_ (2003-10-08 14:41) [23]>pasha_676 © (08.10.03 14:31) [21]
> ...размер памяти занимаемой ссылкой ...
Это тут вообще причём?
Сам-то понял, что сказал?
← →
nikkie (2003-10-08 14:42) [24]поправка: для того, чтобы получить AV надо сначала хотя бы откомпилировать, я имел в виду такое исправление: Integer(P^) := I;
← →
Digitman (2003-10-08 15:04) [25]
> Плохиш_
> Сам-то понял, что сказал?
все он правильно сказал) ... размер адресной ссылки в Win32 всегда равен 4 байтам
просто следовало бы уточнить, что ссылка, которой оперирует сгенерированный маш.код, не всегда физически представлена областью памяти.
адресная ссылка может располагаться и в одном из 32-хразрядных РОН
← →
pasha_676 (2003-10-08 16:24) [26]
> чтобы получить AV надо сначала хотя бы откомпилировать
Дык не АV получиться а несовместиность типов. Ты что то не то прочитал. Поэтому надо приводить. Как это делать - вообщем то пофигу.
> Чтоб ее обойти надо в ссылку положить адрес P:=@I
> что ж это изменит?
Адрес:=Адресу. Нет несовместимоти типов. То же что и ты написал - Integer(P^):=I; На самом деле конечно не то же самое, но результат почти такой же в P^ храниться 20
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.10.20;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.182 c