Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Указатели


утк ©   (2006-07-03 15:46:00) 

Всем привет! Сколько пытаюсь понять ответ на свой вопрос, не как не могу найти хорошего, доступного ответа на мой вопрос. А вопрос заключается вот в чем: что такое указатель, а главное для чего он нужен? Особенно нужны легкие примеры, например для чего нужно использовать указатели, в каких случаях их нужно использовать а в каких нет. Просто определение этого термина я не раз читал, но вот именно с примерами и задачами указателей, понять не могу.


evvcom   (2006-07-03 17:52:00) [1]

> [2] утк   (03.07.06 15:50)

По сути твой string - тоже указатель, просто язык построен так, что ты этого не видишь. Ты можешь своей s присвоить и 'sss' и 'sssssssssssssssssssssssssssssss'. В первом случае 3 байта, во втором несколько десятков, а в третьем может оказаться и Гиг. Как такое хранить?
В этом случае твоя переменная всего 4 байта и указывает на область памяти, где лежит переменное количество байт. Например, в стринге этот указатель тычет непосредственно на данные, а на 4 байта раньше лежит длина твоего стринга. Это паскалевский тип данных. В Си же принято указывать на данные, которые завершаются нулевым байтом. В Дельфи такой тип это PChar.
Это коротко. А подробнее - читай литературу, разбирайся с Delphi. Копайся в памяти, для этого не помешало бы и ассемблер зацепить :)


Apollon_604   (2006-07-03 17:36:00) [2]

Например, все переменные классового типа - указатели на объект.


type
 TMyType = class
 public
   constructor Create; override;
   destructor Destroy; override;
 end;

....

procedure MyProc;
var
 MyVar1, MyVar2: TMyType;
begin
 MyVar1 := TMyType.Create; // Create - выделение памяти и распределение в ней объекта
 MyVar2 := MyVar1; // Обе переменные указывают на один и тот же объект
end;


MBo   (2006-07-03 16:31:00) [3]

Несколько областей применения указателей (некоторые примеры надуманные):

1. изменяемые параметры процедур/функция
procedure IncIt(var i: integer);
begin
 i:= i + 1;
end;

2. Динамическое выделение памяти, создание динамических структур, списков, деревьев, дельфийских объектов
type
 PRec = ^Rec
 TRec = record
   Data: Integer;
   Next: PRec;
 end;
var PR: PRec;
  New(PR);
  PR^.Data := 1;
  Pr.Next := nil;
. ..
 Dispose(Pr)
------------------
StrList := TStringList.Create;
 
3. Приведение/преобразование типов
  IntVar := PInteger(@ByteArr)^;

 procedure TreatBuf(var Buf);
 begin
   PByteArray(@Buf)[0] :=5;

4.  Доступ к нужному участку памяти, или элементу массива
  PW: PWord;
  PW := @WordArr[0];
 for i := 0 to 9 do begin
   PW^ := 0;
   Inc(PW);//в отличие от WordArr[i] не требуется вычисление адреса, использующее умножение
 end;

и т.д., и т.п.


Desdechado   (2006-07-03 16:15:00) [4]

Есть много стандартных функций, которые требуют не стринг, а PChar. А это и есть указатель.
Функции API тоже часто возвращают указатели, которые могут понадобиться, чтобы потом использовать возвращаемый результат (в т.ч. при вызове других функций).


tesseract   (2006-07-03 16:05:00) [5]


>  т.е. и в моем случае со string можно было бы впихнуть указатель,
>  но зачем? по какому принципу их применяют?


например для передачи значений в функции.


Reindeer Moss Eater   (2006-07-03 16:01:00) [6]

пример из [3] чем не пример?


утк   (2006-07-03 15:59:00) [7]

Я не понимаю, я наверное дико глуп, поэтому и прошу подкрепить примерами.


Reindeer Moss Eater   (2006-07-03 15:53:00) [8]

но зачем?

А если переменной никакой нет, но к данным получить доступ все равно надо?


утк   (2006-07-03 15:50:00) [9]

Я это понимаю, но зачем нужно прибегать к ним? т.е вот допустим я делаю
var
s:string;
begin
s := 'sss';

т.е. в нашем случае компилятор сам определяет адрес в памяти для переменной? а зачем вообще необходимо прибегать к указателям? т.е. и в моем случае со string можно было бы впихнуть указатель, но зачем? по какому принципу их применяют?


Ega23   (2006-07-03 15:48:00) [10]

Указатель - это адрес ячейки памяти, в которой(ых) лежит(ат)  твои данные.


Наверх

Титульная страница Поиск, карта сайта Написать письмо