![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Указатели
утк © (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]Указатель - это адрес ячейки памяти, в которой(ых) лежит(ат) твои данные.