Страница 1 из 1

указатель на указатель: как и почему?

СообщениеДобавлено: 07.01.2011 19:01:39
freeman
Всем привет. В языке С есть сложные конструкции, типа: "указатель на указатель"
Код: Выделить всё
int **ptop;
А есть ли нечто подобное в freepascal? И раз уж на то пошло, то кто-нибудь может объяснить, каковы плюсы таких нагромождений? Сам я любитель, типа хобби. Если есть профи, то хотел бы услышать ваши мысли на тему: зачем нужны такие сложные указатели? 8)

Re: указатель на указатель: как и почему?

СообщениеДобавлено: 07.01.2011 19:09:20
Vadim
freeman
На вскидку - ppchar, т.е. указатель на указатель на символ. Применяется для работы с массивами, которые формируют сишные функции из всевозможных динамических библиотек.
Больше ничего не припомню. В своих программах другие подобные типы никогда не использовал.

Re: указатель на указатель: как и почему?

СообщениеДобавлено: 07.01.2011 20:35:56
alexs
freeman писал(а):Всем привет. В языке С есть сложные конструкции, типа: "указатель на указатель"

Совет - как старайся как можно меньше использовать в явном виде указатели (особенно не типизированные).
Практически на все случаи жизни есть инструменты в самом языке.

Re: указатель на указатель: как и почему?

СообщениеДобавлено: 07.01.2011 20:49:14
Nik
А есть ли нечто подобное в freepascal? И раз уж на то пошло, то кто-нибудь может объяснить, каковы плюсы таких нагромождений?

А оно нам надо, нагромождения эти?

Re: указатель на указатель: как и почему?

СообщениеДобавлено: 07.01.2011 21:50:51
devels
Конечно есть :o

Код: Выделить всё
type
   pint   = ^integer;
   ppint = ^pint;

var
  X: PPInt;
begin
   new(X);
   new(X^);
   X^^ := 20;
   WriteLn(X^^);
   dispose(X^);
   dispose(X);
end;


Честно говоря как это использовать я не знаю, ты бы мог показать исходники на си.

Re: указатель на указатель: как и почему?

СообщениеДобавлено: 07.01.2011 23:29:28
Odyssey
freeman писал(а):В языке С есть сложные конструкции, типа: "указатель на указатель" ... А есть ли нечто подобное в freepascal? И раз уж на то пошло, то кто-нибудь может объяснить, каковы плюсы таких нагромождений? ... зачем нужны такие сложные указатели?

В C указатель -- один из необходимых типов, на котором строится работа с более сложными типами -- строками, массивами. Поэтому двойные указатели применяются как минимум для двух целей:
1) Передача по ссылке обычного указателя, например в функцию. Тогда внутри функции можно просто перенацелить указатель "второго уровня" с одного указателя "первого уровня" на другой, без операций с содержимым. Например, подменить одну строку другой.
2) Многомерные типы, например массив строк. Массив в C = указатель на первый элемент, строка = указатель на первый символ. Массив строк = указатель на указатель на первый символ первой строки.

В Pascal работа с указателями полностью поддерживается, как минимум для взаимодействия с библиотеками на C, но чаще всего есть собственные более высокоуровневые конструкции, которые оборачивают работу с указателями и выделение памяти, чтобы мы могли заниматься более важными вещами. Например, для массива строк есть TStringList.