Вверх ↑
Этот топик читают: Гость
Ответов: 1321
Рейтинг: 37
#226: 2011-03-25 17:05:12 ЛС | профиль | цитата
Я начал изучение указателей в IC, и у меня сразу возникли вопросы

var
p1: ^string;
s1: string;
begin
s1 := 'NotTest';
new(p1);
p1 := @s1;
p1^ := 'Test';
Label1.Caption := s1
new(p1); - что означает эта строка
p1 := @s1; - и что означает @


карма: 0

0
Ответов: 4622
Рейтинг: 746
#227: 2011-03-25 17:20:40 ЛС | профиль | цитата
new(p1) - выделить память под переменную типа string и занести адрес (указатель) выделенного участка в переменную p1.
Сколько нужно выделить памяти определяется типом указателя при объявлении переменной p1.
------------ Дoбавленo в 17.18:
p1 := @s1 - переменной p1 присвоить адрес (указатель) по которому расположено значение переменной s1.
------------ Дoбавленo в 17.20:
То-есть, @ означает адрес переменной, а не данные, которые она содержит.
карма: 26

0
Ответов: 758
Рейтинг: 112
#228: 2011-03-25 17:26:12 ЛС | профиль | цитата
А что означает знак ^
тут --> p1: ^string
и тут --> p1^ := 'Test';
карма: 1

0
Ответов: 4622
Рейтинг: 746
#229: 2011-03-25 17:45:15 ЛС | профиль | цитата
p1: ^string; - переменная p1 объявляется как указатель на область памяти, которая содержит данные типа string (в отличии от p1: string;, где p1 объявляется как string, а не как указатель на string).

------------ Дoбавленo в 17.44:
p1^ := 'Test';
Здесь p1^ указывает, что нужно взять адрес, который хранится в p1 и записать по этому адресу строку 'Test'.
Если бы мы записали p1 := 'Test', то компилятор выдал бы ошибку несоответствия типов, так как p1 является 4-байтным числом, а мы ей пытаемся присвоить строку.
карма: 26

0
Разработчик
Ответов: 26073
Рейтинг: 2122
#230: 2011-03-25 17:47:49 ЛС | профиль | цитата
У меня тут такой вопрос возник -- а откуда такой бредовый код по работе со строками
Это уму непостижимо -- использовать new для строки. Сразу возникает параллельноый вопрос, а где dispose на эту переменную Это потенциальный динамический мусор, а не код
карма: 22

0
Ответов: 4622
Рейтинг: 746
#231: 2011-03-25 17:52:34 ЛС | профиль | цитата
У меня он тоже возник, но я не хотел запутывать Rom'у в самом начале изучения.
Для тех, кто не знает: при работе со строками и указателями на них функция new() не используется, так как память под них выделяется автоматически компилятором.
------------ Дoбавленo в 17.52:
[offtop]nesco успел дополнить свой пост[/offtop]
карма: 26

0
Разработчик
Ответов: 26073
Рейтинг: 2122
#232: 2011-03-25 18:00:02 ЛС | профиль | цитата
Netspirit, такие коды надо рубить в зародыше, дабы потом мучений не было по глюкам и доводкам
------------ Дoбавленo в 17.59:
Вместо вот этого

p1: ^string;
Надо использовать вот это

p1: PChar;
Тогда вот этот бред

  new(p1);
p1 := @s1;
меняется вот на такое

  p1 := @s1[1];
карма: 22

0
Ответов: 4622
Рейтинг: 746
#233: 2011-03-25 18:02:48 ЛС | профиль | цитата
nesco, мне кажется реально такой код вряд-ли кто-то где-то применит без четкого понятия для чего это ему нужно.
Обычно вместо
p1: ^string;
пишут
p1: PChar;
------------ Дoбавленo в 18.02:
nesco, опять ты свои посты правишь прежде, чем я отвечу.
карма: 26

0
Ответов: 1321
Рейтинг: 37
#234: 2011-03-25 18:24:02 ЛС | профиль | цитата
Я это тут нашел
Сайт
------------ Дoбавленo в 18.23:
p1 := @s1[1];
а что здесь значит 1
карма: 0

0
Ответов: 5446
Рейтинг: 323
#235: 2011-03-25 18:31:33 ЛС | профиль | цитата
Roma, иди почитай учебник по паскалю.
карма: 1

0
Ответов: 4622
Рейтинг: 746
#236: 2011-03-25 18:32:35 ЛС | профиль | цитата
В Delphi строки рассматриваются как массив символов, поэтому символ из строки можно получить по его индексу.
@s1[1] - означает адрес первого символа строки. Но, думаю, более понятно было бы записывать
p1 := @s1;
карма: 26

0
Ответов: 1321
Рейтинг: 37
#237: 2011-03-25 18:34:27 ЛС | профиль | цитата
В паскале этого нет, разве что это массив
(Может я и не видел)
------------ Дoбавленo в 18.34:
[flood]Угадал!!![/flood]
карма: 0

0
Разработчик
Ответов: 26073
Рейтинг: 2122
#238: 2011-03-25 18:37:26 ЛС | профиль | цитата
Roma писал(а):
разве что это массив

Действительно, строка и есть массив символов, но счет идет не с нуля, а с единицы.
Хочу добавить, что PChar -- универсальный тип и может применяться как указатель для массива любых ASCII символов со значениями от 0 до 255. Ничего не напоминает
карма: 22

0
Ответов: 1321
Рейтинг: 37
#239: 2011-03-25 18:45:58 ЛС | профиль | цитата
Может всё это перенести в новую тему по IC
А то много скопилось
карма: 0

0
Разработчик
Ответов: 26073
Рейтинг: 2122
#240: 2011-03-25 19:00:07 ЛС | профиль | цитата
Netspirit писал(а):
более понятно было бы записывать
p1 := @s1;

Это неправильная запись и никогда она работать не будет

code_23110.txt
карма: 22

0
файлы: 1code_23110.txt [624B] [232]
Сообщение
...
Прикрепленные файлы
(файлы не залиты)