Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; ColdFire; 40 тыс.
e-mail: jobsmp@pochta.ru
|
Самому-то лучше. Вот шпаргалка не помню из учебника(+)
Отправлено
Quasy 19 декабря 2007 г. 17:28
В ответ на:
мозк... отправлено
ы 19 декабря 2007 г. 16:43
Что означают описания?
int i; // целое.
int *pi; // указатель на целое.
int *api[3]; // массив из 3х ук-лей на целые.
int (*pai)[3]; // указатель на массив из 3х целых.
// можно описать как int **pai;
int fi(); // функция, возвращающая целое.
int *fpi(); // ф-ция, возвр. ук-ль на целое.
int (*pfi)(); // ук-ль на ф-цию, возвращающую целое.
int *(*pfpi)(); // ук-ль на ф-цию, возвр. ук-ль на int.
int (*pfpfi())(); // ф-ция, возвращающая указатель на
// "функцию, возвращающую целое".
int (*fai())[3]; // ф-ция, возвр. ук-ль на массив
// из 3х целых. иначе ее
// можно описать как int **fai();
int (*apfi[3])(); // массив из 3х ук-лей на функции,
// возвращающие целые.
Переменные в Си описываются в формате их использования. Так описание
int (*f)();
означает, что f можно использовать в виде
int value;
value = (*f)(1, 2, 3 /* список аргументов */);
Однако из такого способа описания тип самой описываемой переменной и его смысл довольно неочевидны. Приведем прием (позаимствованный из журнала "Communications of the ACM"), позволяющий прояснить смысл описания. Описание на Си переводится в описание в стиле языка Algol-68. Далее
ref ТИП означает "указатель на ТИП"
proc() ТИП "функция, возвращающая ТИП"
array of ТИП "массив из элементов ТИПа"
x: ТИП "x имеет тип ТИП"
Приведем несколько примеров, из которых ясен и способ преобразования:
int (*f())(); означает
(*f())() : int
*f() : proc() int
f() : ref proc() int
f : proc() ref proc() int
то есть f - функция, возвращающая указатель на функцию, возвращающую целое.
int (*f[3])(); означает
(*f[])() : int
*f[] : proc() int
f[] : ref proc() int
f : array of ref proc() int
f - массив указателей на функции, возвращающие целые. Обратно: опишем g как указатель на функцию, возвращающую указатель на массив из 5и указателей на функции, возвращающие указатели на целые.
g : ref p() ref array of ref p() ref int
*g : p() ref array of ref p() ref int
(*g)() : ref array of ref p() ref int
*(*g)() : array of ref p() ref int
(*(*g)())[5] : ref p() ref int
*(*(*g)())[5] : p() ref int
(*(*(*g)())[5])(): ref int
*(*(*(*g)())[5])(): int
int *(*(*(*g)())[5])();
В Си невозможны функции, возвращающие массив:
proc() array of ...
а только
proc() ref array of ...
Само название типа (например, для использования в операции приведения типа) получается вычеркиванием имени переменной (а также можно опустить размер массива):
g = ( int *(*(*(*)())[])() ) 0;
Составить ответ | Вернуться на конференцию
Ответы