Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: модификатор const. Как правильно использовать в Си
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Страницы: 1, 2, 3
DASM
"в С указатели на функции не индексируются," - о как, даж не знал
А недавно узнал для чего были ссылки в ++ сделаны - именно потому, что иначе была бы невозможна перегрузка некоторых операторов для объектов без конфликта с семантикой С, она уже задействована под арифметикой указателей. А не всякие там пояснения что мол для безопасности, типа ссылку нельзя неинициализированной и все такое (кстати в гугл используют указатели в явном виде (ну когда на ++ пишут)).
ViKo
char (*(*func(void))[3])(void);
1 : 1 копия примера из K&R, на трезвую голову такого не придумать.
Arlleex
Цитата(ViKo @ Jan 30 2018, 16:28) *
char (*(*func(void))[3])(void);
1 : 1 копия примера из K&R, на трезвую голову такого не придумать.

K&R прочел совсем немного, к сожалению, и не знал, что у них вообще затрагивается эта тема laughing.gif
Пример действительно из головы.
Ведь можно и еще больше усложнить...
P.S. Посмотрел в K&R - действительно, есть такой пример biggrin.gif
sigmaN
Я тут подумал... Видимо придется и мне K&R прочесть на всякий случай biggrin.gif
alx.bilous
Если вам так нравится разбирать сложные декларации, cdecl существует уже лет как 20, даже веб интерфейс есть https://cdecl.org
AHTOXA
Цитата(alx.bilous @ Feb 2 2018, 21:28) *
даже веб интерфейс есть https://cdecl.org

На вот это
Код
char(*(*func(void))[3])(void)

он пишет: "syntax error" sm.gif
sigmaN
gcc при этом возражений не имеет
alx.bilous
так уж получилось что func здесь зарезервированное слово

cdecl> explain char(*(*fffff(void))[3])(void)
declare fffff as function (void) returning pointer to array 3 of pointer to function (void) returning char
AHTOXA
Цитата(alx.bilous @ Feb 3 2018, 01:55) *
declare fffff as function (void) returning pointer to array 3 of pointer to function (void) returning char

Хрен редьки не слащеsm.gif

ЗЫ. Спасибо за инфу о cdecl, не знал.
501-q
Цитата(Arlleex @ Jan 30 2018, 15:38) *
Технически любое имя функции - это есть указатель. Даже
Код
void f1(void);

Согласно Вашей логике, f1 - не функция? Стандартописатели из комитета ANSI C ошиблись с терминологией? rolleyes.gif

Ну да, f1 не функция, а имя функции. Значением f1 является адрес функции. Две записи абсолютно одинаковы:
Код
void (*v1)(void) = f1;
void (*v2)(void) = &f1;

Для адреса функции оператор () выполняет вызов соответствующей функции. Т.е. вызов функции по известному адресу можно сделать так:
Код
(void (*)(int)) 0x1000 (5);


Илья
asnoeuh
Удобно для расшифровки выражение подобных char (*(*func(void))[3])(void); пользоваться The "Clockwise/Spiral Rule''

Я в голове ещё держу - "Начало отсчёта "12:00" - начало суток, и в нормальном течении времени..."
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.