Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
1-1149600174
Тфьу
2006-06-06 17:22
2006.07.23
Не нашел, как получить картинку TChart а...


10-1122705847
rentgen
2005-07-30 10:44
2006.07.23
WorkBooks.Title -?


15-1150884033
syte_ser78
2006-06-21 14:00
2006.07.23
Гемберд или Каньон?


2-1149947049
TGX
2006-06-10 17:44
2006.07.23
Низкоуровневый доступ к файлу


15-1150941036
Perwomai
2006-06-22 05:50
2006.07.23
Футбол и национализм





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский