<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=50681&amp;view=findpost&amp;p=402438</guid>
        <pubDate>Wed, 14 Jul 2004 11:18:13 +0000</pubDate>
        <title>Указатели (Pointers)</title>
        <link>https://forum.sources.ru/index.php?showtopic=50681&amp;view=findpost&amp;p=402438</link>
        <description><![CDATA[Romtek: Вот вам и примеры  ;) <br>
<br>
<strong class='tag-b'>с типизированными указателями</strong><br>
В этом примере приводятся способы использования типизированных указателей:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp; TInfo = record</div><div class="code_line">&nbsp;&nbsp; &nbsp; Size,</div><div class="code_line">&nbsp;&nbsp; &nbsp; Len: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp; ss: &nbsp;string[20];</div><div class="code_line">&nbsp;&nbsp; end;</div><div class="code_line">&nbsp;&nbsp; Arr = array[1..10] of word;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp; PInteger: ^Integer; { указатель на тип Integer }</div><div class="code_line">&nbsp;&nbsp; PInfo: &nbsp; &nbsp;^TInfo; &nbsp; { указатель на тип TInfo}</div><div class="code_line">&nbsp;&nbsp; PA: &nbsp; &nbsp; &nbsp; ^Arr; &nbsp; &nbsp; { указатель на тип Arr}</div><div class="code_line">&nbsp;&nbsp; P: &nbsp; &nbsp; &nbsp; &nbsp;Pointer;</div><div class="code_line">&nbsp;&nbsp; Sz,i: &nbsp; &nbsp; word;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; writeln;</div><div class="code_line">&nbsp;&nbsp; &nbsp; New (PInteger); { выделение памяти под указатель на тип Integer }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;PInteger^ := 123; { значению по адресу PInteger зададим значение }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;writeln (&#39;Value = &#39;, PInteger^);</div><div class="code_line">&nbsp;&nbsp; &nbsp; Dispose (PInteger); { освобождение зарезервированной памяти }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; New (PA); { выделение памяти под указатель на тип Arr }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for i := 1 to 10 do PA^[i] := i * 2 - 1; { значениям массива по адресу PA зададим значения }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for i := 1 to 10 do write (PA^[i] : 4); { выведем элементы массива по адресу PA }</div><div class="code_line">&nbsp;&nbsp; &nbsp; Dispose (PA); { освобождение зарезервированной памяти }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; New (PInfo); { выделение памяти под указатель на тип TInfo}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;with PInfo^ do { заносим данные в запись по адресу PInfo }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;writeln;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ вводим значения переменных в записи }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;write (&#39;Size: &#39;); readln (Size);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;write (&#39;Length: &#39;); readln (Len);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;write (&#39;String: &#39;); readln (ss);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;writeln (Size:6, Len:6, ss:20); { выводим их значения }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; Dispose (PInfo); { освобождение зарезервированной памяти после использования записи }</div><div class="code_line">&nbsp;</div><div class="code_line">end.</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
<strong class='tag-b'>с нетипизированными указателями</strong><br>
В этом примере считывается файл в буффер с применением нетипизированного указателя и выводит количество цифр в нём.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp; &nbsp; Digits: word;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure AnalizeBlock (Buf: pointer; Sz: word);</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp; &nbsp; ByteArr = Array [1..MaxInt] of char;</div><div class="code_line">&nbsp;&nbsp; &nbsp; PByteArr = ^ByteArr;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp; &nbsp; i: word;</div><div class="code_line">&nbsp;&nbsp; &nbsp; P: PByteArr;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; P := PByteArr (Buf);</div><div class="code_line">&nbsp;&nbsp; &nbsp; for i := 0 to Sz - 1 do</div><div class="code_line">&nbsp;&nbsp; &nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if P^[i] in [&#39;0&#39;..&#39;9&#39;] then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;inc (Digits);</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp; Buffer: Pointer;</div><div class="code_line">&nbsp;&nbsp; F: &nbsp; &nbsp; &nbsp;file;</div><div class="code_line">&nbsp;&nbsp; Size,</div><div class="code_line">&nbsp;&nbsp; Count: &nbsp;word;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; writeln;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; Assign (F, &#39;test.dat&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; {$I-}</div><div class="code_line">&nbsp;&nbsp; &nbsp; Reset (F, 1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; {$I+}</div><div class="code_line">&nbsp;&nbsp; &nbsp; if IOresult &#60;&#62; 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Halt (-1);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; Digits := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; Size &nbsp; := 4096;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; GetMem (Buffer, Size);</div><div class="code_line">&nbsp;&nbsp; &nbsp; if Buffer &#60;&#62; Nil then</div><div class="code_line">&nbsp;&nbsp; &nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while Not EOF (F) do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; BlockRead (F, Buffer^, Size, Count);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AnalizeBlock (Buffer, Size);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FreeMem (Buffer, Size);</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; Close (F);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; writeln (&#39;File contains &#39;, Digits, &#39; digits.&#39;);</div><div class="code_line">end.</div></ol></div></div></div></div><br>
<hr><strong class='tag-b'>Скачать исходники</strong>:]]></description>
        <author>Romtek</author>
        <category>Pascal: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=50681&amp;view=findpost&amp;p=333667</guid>
        <pubDate>Wed, 07 Apr 2004 15:29:51 +0000</pubDate>
        <title>Указатели (Pointers)</title>
        <link>https://forum.sources.ru/index.php?showtopic=50681&amp;view=findpost&amp;p=333667</link>
        <description><![CDATA[romtek: <span class='tag-size' data-value='13' style='font-size:13pt;'><span class="tag-color tag-color-named" data-value="purple" style="color: purple"><span class='tag-u'>Для работы с указателями необходимо:</span></span></span><br>
<br>
<span class='tag-size' data-value='11' style='font-size:11pt;'><br>
1. Описать указатель<br>
2. Задать значение указателю<br>
3. Операция разыменования<br>
4. Освободить динамическую память<br>
</span><br>
<br>
1) <strong class='tag-b'>Описать указатель.</strong><br>
  При этом в статической области памяти будет выделено 4 байт и связано с его идентификатором.<br>
<ul class="tag-list"><li>нетипизированный<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Var</div><div class="code_line">Ptr1 : Pointer;</div></ol></div></div></div></div><br>
</li><li>типизированный<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Type</div><div class="code_line">&nbsp;&nbsp;Base = Record</div><div class="code_line">&nbsp;&nbsp; &nbsp;Number : Byte;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Name : String[30];</div><div class="code_line">&nbsp;&nbsp; &nbsp;Phith,Bio,Math : Char;</div><div class="code_line">&nbsp;&nbsp;End;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Lang = Record</div><div class="code_line">&nbsp;&nbsp; &nbsp;Engl,Ukr,Rus : Char;</div><div class="code_line">&nbsp;&nbsp;End;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Mass = Array[1..36] Of Base;</div><div class="code_line">&nbsp;&nbsp;LstPtr = ^List;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;List = Record</div><div class="code_line">&nbsp;&nbsp; &nbsp;Number,Ifo :Integer;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">Var</div><div class="code_line">&nbsp;&nbsp;BegPtr,EndPtr : LstPtr;</div><div class="code_line">&nbsp;&nbsp;Ptr1 : ^Base;</div><div class="code_line">&nbsp;&nbsp;Ptr2 : ^Mass;</div><div class="code_line">&nbsp;&nbsp;Ptr3 : LstPtr;</div><div class="code_line">&nbsp;&nbsp;Ptr4 : ^String;</div><div class="code_line">&nbsp;&nbsp;Ptr5 : ^Integer;</div><div class="code_line">&nbsp;&nbsp;Ptr6 : ^Real;</div></ol></div></div></div></div></li></ul><br>
<br>
2) <strong class='tag-b'>Задать значение указателю</strong><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Var</div><div class="code_line">&nbsp;&nbsp;K: Integer;</div><div class="code_line">&nbsp;&nbsp;P: Pointer;</div><div class="code_line">.....</div><div class="code_line">P:= Addr(K); { Присвоить адрес переменной K }</div><div class="code_line">.....</div></ol></div></div></div></div><br>
Функция  <em class='tag-i'>Addr(X)</em> и операция <em class='tag-i'>@X</em>, возвращают значение типа Pointer, являющееся началом области памяти, в которой размещается значение переменной <em class='tag-i'>Х</em>. Переменная <em class='tag-i'>Х</em> -  может быть любого типа.<br>
<br>
Для выделения динамической памяти величинам при помощи <strong class='tag-b'>типизированных указателей</strong> используется процедура <strong class='tag-b'><em class='tag-i'>New(TypePtr)</em></strong><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Var</div><div class="code_line">Ptr :^integer;</div><div class="code_line">.......</div><div class="code_line">New(Ptr);</div></ol></div></div></div></div>, где <em class='tag-i'>TypePtr</em> - типизированный указатель. Под действием данной процедуры переменной <em class='tag-i'>TypePtr</em> присваивается значение предопределённой переменной <em class='tag-i'>HeapPtr</em>, в динамической памяти выделяется место соответственно типу указателя и значение переменной <em class='tag-i'>HeapPtr</em> изменяется на величину этого типа. В дальнейшем при помощи этого указателя в динамической памяти можно размещать величины тип, которых соответствует типу типизированного указателя и иметь к ним доступ.<br>
<br>
Для выделения динамической памяти величинам при помощи <strong class='tag-b'>нетипизированных указателей</strong> используется процедура <strong class='tag-b'><em class='tag-i'>GetMem(TPtr,Size)</em></strong><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Var</div><div class="code_line">Ptr:Pointer;</div><div class="code_line">..........</div><div class="code_line">GetMem(Ptr,50);</div></ol></div></div></div></div>, где  <em class='tag-i'>TPtr</em> - нетипизированный указатель типа <em class='tag-i'>Pointer</em>,  <em class='tag-i'>Size</em>  - величина типа <em class='tag-i'>Word</em>, количество выделяемой динамической памяти. Под действием данной процедуры переменной <em class='tag-i'>TPtr</em> присваивается значение предопределённой переменной <em class='tag-i'>HeapPtr</em>, в динамической памяти выделяется участок размером <em class='tag-i'>Size</em> байт, значение переменной <em class='tag-i'>HeapPtr</em> изменяется на величину параметра <em class='tag-i'>Size</em>. В дальнейшем при помощи этого указателя в выделенном учаске динамической памяти можно размещать любые величины размером <em class='tag-i'>Size</em> байт и иметь к ним доступ.<br>
<br>
Для определения количества памяти необходимой для размещения величины какого - либо типа, в языке Pascal определена функция <em class='tag-i'>SizeOf(X)</em>.<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Var sameVar: byte;</div><div class="code_line">&nbsp;&nbsp;K:word;</div><div class="code_line">..........</div><div class="code_line">K=SizeOf(sameVar); {k=1}</div><div class="code_line">..........</div></ol></div></div></div></div>, где <em class='tag-i'>X</em> - идентификатор переменной, функции или типа. В качестве своего результата функция возвращает величину типа <em class='tag-i'>Word</em> - количество памяти в байтах необходимое для размещения <em class='tag-i'>X</em>.<br>
<br>
<br>
3) <strong class='tag-b'>Операция разыменования</strong><br>
    Суть её состоит в переходе от указателя к значению, на которое он указывает. Эта операци обозначается - идентификатор указателя^ . Результатом операции является значение величины, на которую указывает указатель, т.е. осуществляется доступ к той области памяти, с которой связан указатель. Разыменованному типизированному указателю можно присваивать значения того типа, которым он описан или присваивать его значения переменным того же типа. Аналогично и для нетипизированных указателей, но только надо следить, чтобы размер памяти указанной при создании нетипизированного указателя, совпадал с размером величины, которую мы заносим в память, или в которую мы считываем значение.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Var</div><div class="code_line">I: ^Integer;</div><div class="code_line">R: ^Real;</div><div class="code_line">Begin</div><div class="code_line">New( I );</div><div class="code_line">New( R );</div><div class="code_line">I^:=200;</div><div class="code_line">R^:=3.1456;</div><div class="code_line">Writeln(I^); Writeln(R^); {На экран будут выведены значения 200 и 3.1456}</div><div class="code_line">End.</div></ol></div></div></div></div><br>
<br>
<br>
4) <strong class='tag-b'>Освободить динамическую память</strong><br>
<br>
По окончанию работы с величинами, размещёнными в динамической памяти, её надо освободить от них.<br>
<br>
Для <strong class='tag-b'>типизированных указателей</strong> определена процедура <em class='tag-i'><strong class='tag-b'>Dispose(Идентификатор_указателя)</strong></em><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Var</div><div class="code_line">Ptr :^integer;</div><div class="code_line">............</div><div class="code_line">new(ptr);</div><div class="code_line">............</div><div class="code_line">dispose(ptr);</div></ol></div></div></div></div>  После выполнения этой процедуры значение типизированнго указателя неопределено и теряется значение, на которое он указывал. Дальнейшее использование этого указателя возможно, только после присваивания ему значения другого указателя или повторного применения процедуры <em class='tag-i'>New</em>. Процедуру <em class='tag-i'>Dispose</em> можно применять только к типизированным указателям значение, которых определено.<br>
<br>
Для <strong class='tag-b'>нетипизированных указателей</strong> определена процедура <strong class='tag-b'><em class='tag-i'>FreeMem(P, Size)</em></strong> <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Var</div><div class="code_line">ptr :Pointer;</div><div class="code_line">............</div><div class="code_line">GetMem(ptr,67); ............</div><div class="code_line">FreeMem(ptr,67);</div></ol></div></div></div></div> <br>
, где <em class='tag-i'>P</em> указатель типа <em class='tag-i'>Pointer</em>, <em class='tag-i'>Size</em> величина типа <em class='tag-i'>Word</em> (количество освождаемой динамической памяти). Под действием данной процедуры освобождается участок памяти, начиная с адреса находящегося в указателе <em class='tag-i'>P</em>, размером.<em class='tag-i'>Size</em>. Значение указателя становится неопределённым. Данную процедуру нельзя применять к указателям значение, которых неопределено и следует внимательно следить за размером освобождаемой памяти. Применение этих процедур не изменяет значение переменной <em class='tag-i'>HeapPtr</em> ,а освобождаемая динамическая память не учитывается как неиспользованная. На неё не будут указывать указатели при последующих вызовах процедур: <em class='tag-i'>New</em> или <em class='tag-i'>GetMem</em>.]]></description>
        <author>romtek</author>
        <category>Pascal: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=50681&amp;view=findpost&amp;p=333661</guid>
        <pubDate>Wed, 07 Apr 2004 15:18:44 +0000</pubDate>
        <title>Указатели (Pointers)</title>
        <link>https://forum.sources.ru/index.php?showtopic=50681&amp;view=findpost&amp;p=333661</link>
        <description><![CDATA[romtek: <div class='tag-align-center'><span class="tag-font" data-value="Times" style="font-family:Times"><span class='tag-size' data-value='14' style='font-size:14pt;'><span class="tag-color tag-color-named" data-value="blue" style="color: blue"><strong class='tag-b'>- Указатели - Pointers -</strong></span></span></span></div><br>
<br>
   В информатике существует целый ряд задач, в которых используются динамические структуры данных. Динамическими структурами данных считаются такие, размер которых заранее неизвестен и (или) изменяется в процессе выполнения программы. Связанные структуры являются динамическими к ним относятся: списки, стеки, очереди, графы, деревья.<br>
   Динамическое размещение данных предусматривает использование динамической памяти, хотя в ней можно размещать величины любого типа.<br>
<br>
<strong class='tag-b'><span class='tag-u'>Динамическая память</span> (куча)</strong> - это оперативная память компьютера, предоставляемая программе при её работе за вычетом сегмента данных, стека, памяти используемой системными и резидентными программами, и собственно телом самой исполняемой программы.<br>
<br>
Размер динамической памяти можно устанавливать из среды или из самой программы специальными директивами компилятора.<br>
   Куча первоначально всегда свободна и заполняется от нижних адресов в области кучи. За стоянием кучи можно следить при помощи специально предопределённых в языке Pascal переменных типа указатель (<em class='tag-i'>Pointer</em>):<ul class="tag-list"><li><strong class='tag-b'>HeapOrg</strong> - содержит в себе адрес начала кучи, её значение не изменяется в процессе выполнения программы.</li><li><strong class='tag-b'>HeapPtr</strong> - содержит в себе начало непрерывного ещё неиспользованного участка кучи, каждый раз, когда в куче размещается новая величина значение этого указателя изменяется на размер этой переменной.</li><li><strong class='tag-b'>FreeList</strong> - указывает на конец кучи (список свободных блоков кучи).</li></ul>]]></description>
        <author>romtek</author>
        <category>Pascal: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	