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

Вниз

Ссылки и указатели.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.014 c
14-65636
LeNa19
2003-09-16 22:03
2003.10.20
прокси для локальной сети


4-65676
Anikul
2003-08-11 22:22
2003.10.20
Как взять текст из ДОС-окна


1-65482
webpauk
2003-10-08 17:41
2003.10.20
component property


1-65495
Ma}{
2003-10-08 15:59
2003.10.20
Как показать MainForm на весь экран....


14-65621
Ilia
2003-10-01 02:31
2003.10.20
Help!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!