Форум: "Начинающим";
Текущий архив: 2006.07.23;
Скачать: [xml.tar.bz2];
ВнизУказатели Найти похожие ветки
← →
утк (2006-07-03 15:46) [0]Всем привет! Сколько пытаюсь понять ответ на свой вопрос, не как не могу найти хорошего, доступного ответа на мой вопрос. А вопрос заключается вот в чем: что такое указатель, а главное для чего он нужен? Особенно нужны легкие примеры, например для чего нужно использовать указатели, в каких случаях их нужно использовать а в каких нет. Просто определение этого термина я не раз читал, но вот именно с примерами и задачами указателей, понять не могу.
← →
Ega23 © (2006-07-03 15:48) [1]Указатель - это адрес ячейки памяти, в которой(ых) лежит(ат) твои данные.
← →
утк (2006-07-03 15:50) [2]Я это понимаю, но зачем нужно прибегать к ним? т.е вот допустим я делаю
var
s:string;
begin
s := "sss";
т.е. в нашем случае компилятор сам определяет адрес в памяти для переменной? а зачем вообще необходимо прибегать к указателям? т.е. и в моем случае со string можно было бы впихнуть указатель, но зачем? по какому принципу их применяют?
← →
Reindeer Moss Eater © (2006-07-03 15:53) [3]но зачем?
А если переменной никакой нет, но к данным получить доступ все равно надо?
← →
утк (2006-07-03 15:59) [4]Я не понимаю, я наверное дико глуп, поэтому и прошу подкрепить примерами.
← →
Reindeer Moss Eater © (2006-07-03 16:01) [5]пример из [3] чем не пример?
← →
tesseract © (2006-07-03 16:05) [6]
> т.е. и в моем случае со string можно было бы впихнуть указатель,
> но зачем? по какому принципу их применяют?
например для передачи значений в функции.
← →
Desdechado © (2006-07-03 16:15) [7]Есть много стандартных функций, которые требуют не стринг, а PChar. А это и есть указатель.
Функции API тоже часто возвращают указатели, которые могут понадобиться, чтобы потом использовать возвращаемый результат (в т.ч. при вызове других функций).
← →
MBo © (2006-07-03 16:31) [8]Несколько областей применения указателей (некоторые примеры надуманные):
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;
и т.д., и т.п.
← →
Apollon_604 (2006-07-03 17:36) [9]Например, все переменные классового типа - указатели на объект.
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;
← →
evvcom © (2006-07-03 17:52) [10]> [2] утк (03.07.06 15:50)
По сути твой string - тоже указатель, просто язык построен так, что ты этого не видишь. Ты можешь своей s присвоить и "sss" и "sssssssssssssssssssssssssssssss". В первом случае 3 байта, во втором несколько десятков, а в третьем может оказаться и Гиг. Как такое хранить?
В этом случае твоя переменная всего 4 байта и указывает на область памяти, где лежит переменное количество байт. Например, в стринге этот указатель тычет непосредственно на данные, а на 4 байта раньше лежит длина твоего стринга. Это паскалевский тип данных. В Си же принято указывать на данные, которые завершаются нулевым байтом. В Дельфи такой тип это PChar.
Это коротко. А подробнее - читай литературу, разбирайся с Delphi. Копайся в памяти, для этого не помешало бы и ассемблер зацепить :)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.07.23;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.018 c