здравствуйте уважаемые эксперты..... Вот какой у меня вопрос: Про указатели - var p1,p2: ^integer; p3:^real; pp:pointer; - нетипизированный p1:=p2; - понятно pp:=p3;- понятно p1:=pp; - а вот тут несоответствие типов - обьясните по подробнее как на аппаратном уровне это всё будет сходиться Заранее благодарен
Добрый день, _hf! p1,p2 и p3 ссылаются на участки памяти размером в 2(integer) и 4(real) байта соответственно. После pp = p3 pp стал real, а после этого вы integer пытаетесь присвоить real и на это он вполне естественным образом ругается
Ответ отправлен: 11.05.2003, 20:11 Отправитель: Shurik Отвечает _vt
Здравствуйте, _hf! На аппаратном уровне нет никаких типов данных, типы данных существуют только в языках высокого уровня. Компилятор подставляет в генерируемый машинный код непосредственные адреса данных, с которыми и работает процессор.
Ответ отправлен: 11.05.2003, 23:34 Отправитель: _vt Отвечает Pin
Здравствуйте, _hf! Нетипизированные указатели служат для хранения любого адреса. p1:=pp; означает установить АДРЕС p1 на значение pp. Само значние не копируется, так что может быть каша! Ответ отправлен: 11.05.2003, 23:42 Отправитель: Pin Отвечает joe
Приветствую Вас, _hf! Нетипизированный указатель - ссылка (т.е. в нём содержится адрес первой ячейки выделенной под него области памяти) на область памяти, в которой может быть всё, что угодно. Типизированный указатель - ссылка на ПЕРЕМЕННУЮ заданного типа. Вообще обычно не прокатывает присвоение типа p1^:=pp^; - здесь перменной целого типа присваивается невесть что, а p1:=pp; должно работать, т.к. здесь присвоение между адресами, а они имеют одинаковый тип Ответ отправлен: 11.05.2003, 19:18 Отправитель: joe Отвечает Sensey
Доброе время суток, _hf! Любой указатель - это 4 байта адреса в формате сегмент:смещение. и не важно, типизированный он или нет. Просто Паскаль сможет проверить соответствие типов в таком присваивании - и указать на ошибку... Поэтому это присвоится, но когда ты указатель разадресуешь - получишь чепуху.
Ответ отправлен: 11.05.2003, 15:03 Отправитель: Sensey Отвечает vitya
Приветствую Вас, _hf! Указатель это всего лишь адрес в памяти, а что там записанно аппаратуру не интересует. Просто если ты будешь работать с этим указателем там будет не нормальное число, а будет мусор. Ответ отправлен: 11.05.2003, 14:52 Отправитель: vitya Отвечает Bill
Добрый день, _hf! Сам то пробовал? Никакого сигнала о несоответствии компилятор не дает. Другое дело, что Паскаль оченно типизированный язык. В нем такие одинаковые массивы не одно и то же: var a1: array[1..5] of Integer; a2: array[1..5] of integer; BEGIN a1:=a2 Или ошибка в какой то программе... Покажи код
Ответ отправлен: 11.05.2003, 18:06 Отправитель: Bill Отвечает Tancho
Приветствую Вас, _hf! На нетипизированный указатель (pp) ты присвоил указатель к реалнный тип( P3 )- это допустимо так как до этот момент pp не был определен, но... потом хочешь присвоить уже определеного как реального указателя рр на указателя целого(p1 - integer) типа, а это в Pascal'е запрещено, а иначе и не можеть быть так как одна променлива целого типа занимает 2 байта, а одна променлива реального типа 4 байта. И можешь себе представить если бы это было рарешено какая путаница можеть настать? P.S. С указательем могуть ставиться еще 2 операции : - сравнивания указателей; - передания указателя как параметр к подпрограму(функции); Здесь то же указатели надо быть от одного и то типа! Ответ отправлен: 13.05.2003, 17:26 Отправитель: Tancho
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.