var
p1: ^string;
s1: string;
begin
s1 := 'NotTest';
new(p1);
p1 := @s1;
p1^ := 'Test';
Label1.Caption := s1
p1 := @s1; - и что означает @
Ответов: 1321
Рейтинг: 37
|
|||
Я начал изучение указателей в IC, и у меня сразу возникли вопросы
p1 := @s1; - и что означает @ |
|||
карма: 0 |
|
Ответов: 4630
Рейтинг: 749
|
|||
new(p1) - выделить память под переменную типа string и занести адрес (указатель) выделенного участка в переменную p1.
Сколько нужно выделить памяти определяется типом указателя при объявлении переменной p1. ------------ Дoбавленo в 17.18: p1 := @s1 - переменной p1 присвоить адрес (указатель) по которому расположено значение переменной s1. ------------ Дoбавленo в 17.20: То-есть, @ означает адрес переменной, а не данные, которые она содержит. |
|||
карма: 26 |
|
Ответов: 758
Рейтинг: 112
|
|||
А что означает знак ^
тут --> p1: ^string и тут --> p1^ := 'Test'; |
|||
карма: 1 |
|
Ответов: 4630
Рейтинг: 749
|
|||
p1: ^string; - переменная p1 объявляется как указатель на область памяти, которая содержит данные типа string (в отличии от p1: string;, где p1 объявляется как string, а не как указатель на string).
------------ Дoбавленo в 17.44: p1^ := 'Test'; Здесь p1^ указывает, что нужно взять адрес, который хранится в p1 и записать по этому адресу строку 'Test'. Если бы мы записали p1 := 'Test', то компилятор выдал бы ошибку несоответствия типов, так как p1 является 4-байтным числом, а мы ей пытаемся присвоить строку. |
|||
карма: 26 |
|
Разработчик
Ответов: 26151
Рейтинг: 2127
|
|||
У меня тут такой вопрос возник -- а откуда такой бредовый код по работе со строками
Это уму непостижимо -- использовать new для строки. Сразу возникает параллельноый вопрос, а где dispose на эту переменную Это потенциальный динамический мусор, а не код |
|||
карма: 22 |
|
Ответов: 4630
Рейтинг: 749
|
|||
У меня он тоже возник, но я не хотел запутывать Rom'у в самом начале изучения.
Для тех, кто не знает: при работе со строками и указателями на них функция new() не используется, так как память под них выделяется автоматически компилятором. ------------ Дoбавленo в 17.52: [offtop]nesco успел дополнить свой пост[/offtop] |
|||
карма: 26 |
|
Разработчик
Ответов: 26151
Рейтинг: 2127
|
|||
Netspirit, такие коды надо рубить в зародыше, дабы потом мучений не было по глюкам и доводкам
------------ Дoбавленo в 17.59: Вместо вот этого
|
|||
карма: 22 |
|
Ответов: 4630
Рейтинг: 749
|
|||
nesco, мне кажется реально такой код вряд-ли кто-то где-то применит без четкого понятия для чего это ему нужно.
Обычно вместо p1: ^string; пишут p1: PChar; ------------ Дoбавленo в 18.02: nesco, опять ты свои посты правишь прежде, чем я отвечу. |
|||
карма: 26 |
|
Ответов: 1321
Рейтинг: 37
|
|||
карма: 0 |
|
Ответов: 5446
Рейтинг: 323
|
|||
Roma, иди почитай учебник по паскалю.
|
|||
карма: 1 |
|
Ответов: 4630
Рейтинг: 749
|
|||
В Delphi строки рассматриваются как массив символов, поэтому символ из строки можно получить по его индексу.
@s1[1] - означает адрес первого символа строки. Но, думаю, более понятно было бы записывать p1 := @s1; |
|||
карма: 26 |
|
Ответов: 1321
Рейтинг: 37
|
|||
В паскале этого нет, разве что это массив
(Может я и не видел) ------------ Дoбавленo в 18.34: [flood]Угадал!!![/flood] |
|||
карма: 0 |
|
Разработчик
Ответов: 26151
Рейтинг: 2127
|
|||
Roma писал(а): разве что это массивДействительно, строка и есть массив символов, но счет идет не с нуля, а с единицы. Хочу добавить, что PChar -- универсальный тип и может применяться как указатель для массива любых ASCII символов со значениями от 0 до 255. Ничего не напоминает |
|||
карма: 22 |
|
Ответов: 1321
Рейтинг: 37
|
|||
Может всё это перенести в новую тему по IC
А то много скопилось |
|||
карма: 0 |
|
Разработчик
Ответов: 26151
Рейтинг: 2127
|
|||
Netspirit писал(а): более понятно было бы записывать
p1 := @s1; Это неправильная запись и никогда она работать не будет code_23110.txt |
|||
карма: 22 |
| ||
файлы: 1 | code_23110.txt [624B] [250] |