Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; 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;



Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 89:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru