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

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Ответить
freeman
незнакомец
Сообщения: 1
Зарегистрирован: 07.01.2011 17:50:50

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

Сообщение freeman »

Всем привет. В языке С есть сложные конструкции, типа: "указатель на указатель"

Код: Выделить всё

int **ptop;
А есть ли нечто подобное в freepascal? И раз уж на то пошло, то кто-нибудь может объяснить, каковы плюсы таких нагромождений? Сам я любитель, типа хобби. Если есть профи, то хотел бы услышать ваши мысли на тему: зачем нужны такие сложные указатели? 8)
Vadim
долгожитель
Сообщения: 4111
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

freeman
На вскидку - ppchar, т.е. указатель на указатель на символ. Применяется для работы с массивами, которые формируют сишные функции из всевозможных динамических библиотек.
Больше ничего не припомню. В своих программах другие подобные типы никогда не использовал.
Аватара пользователя
alexs
долгожитель
Сообщения: 4070
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

freeman писал(а):Всем привет. В языке С есть сложные конструкции, типа: "указатель на указатель"

Совет - как старайся как можно меньше использовать в явном виде указатели (особенно не типизированные).
Практически на все случаи жизни есть инструменты в самом языке.
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

А есть ли нечто подобное в freepascal? И раз уж на то пошло, то кто-нибудь может объяснить, каковы плюсы таких нагромождений?

А оно нам надо, нагромождения эти?
devels
постоялец
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

Сообщение devels »

Конечно есть :o

Код: Выделить всё

type 
   pint   = ^integer;
   ppint = ^pint;

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


Честно говоря как это использовать я не знаю, ты бы мог показать исходники на си.
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

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

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

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