Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-65438
Aleksandr
2003-10-07 16:24
2003.10.20
Как трассировать DLL?


14-65608
Denizzz
2003-10-01 08:10
2003.10.20
Прошу дать мне рекомендации


1-65480
Deimos
2003-10-07 23:04
2003.10.20
Окно не таскается....


1-65535
denis24
2003-10-08 09:59
2003.10.20
tedit


1-65424
Mclaren
2003-10-07 14:20
2003.10.20
Как настроить внешний вид стандартного компонента ?





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