crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Хитрое объявление указателей в Си
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Алексей1153 Дата 1.7.2011, 19:59
 
Цитата
P.S. блин, аж сама запуталась, правила пару раз


для того и придумали его величество typedef )))
Iron Bug Дата 1.7.2011, 7:11
 
Цитата(Litkevich Yuriy @ 1.7.2011, 8:01) *
только нужно писать так:
int (*foo)(char)
вместо
int (*foo)(char bar)

без разницы. компилятор всё равно отбрасывает имя переменной в декларации. зато вот у подсказок будет дополнительная информация в виде названия, в котором обычно поясняется назначение переменной. когда смотришь на заголовочник, типы параметров ни о чём не говорят. когда видишь названия переменных - сразу всё становится понятно.
Litkevich Yuriy Дата 1.7.2011, 6:01
 
Цитата(Kagami @ 30.6.2011, 20:50) *
Техника, известная как «Чтение по спирали/по часовой стрелке» (”Clockwise/Spiral Rule”) позволяет любому программисту разобрать любое объявление языка Си - http://habrahabr.ru/blogs/cpp/100104/
нашёл там в комментариях интересную штуку, объясняет объявление. только нужно писать так:
int (*foo)(char)
вместо
int (*foo)(char bar)


Объявление из первого сообщения:
const char * const * const listnames[]
declare listnames as array of const pointer to const pointer to const char
Iron Bug Дата 30.6.2011, 19:10
 
Цитата(Litkevich Yuriy @ 30.6.2011, 16:31) *
чёт мне даже в голову не приходило, что и такое может быть

  int (*foo)(char bar);

указатель на функцию, возвращающую int, с параметром char

int (*foo[])(char bar) = { foo1, foo2 };

массив указателей на функции, возвращающие int, с параметром char

int (*(*foo)[])(char bar);

указатель на массив указателей на функции, возвращающие int, с параметром char

ну и так далее, вариантов много. всякие там const по необходимости добавляются точно так же, как описано выше.

P.S. блин, аж сама запуталась, правила пару раз :)
Kagami Дата 30.6.2011, 17:50
  Техника, известная как «Чтение по спирали/по часовой стрелке» (“Clockwise/Spiral Rule”) позволяет любому программисту разобрать любое объявление языка Си - http://habrahabr.ru/blogs/cpp/100104/
Litkevich Yuriy Дата 30.6.2011, 13:31
 
Цитата(Iron Bug @ 30.6.2011, 9:30) *
и массивы функций
чёт мне даже в голову не приходило, что и такое может быть :)
Приведи примеры пожалуйста.

Ещё не помешали бы примеры типа как в первом посте, но смесь указателей и ссылок (из реальной жизни).
Litkevich Yuriy Дата 30.6.2011, 13:27
 
Цитата(Iron Bug @ 30.6.2011, 9:30) *
и массивы функций
чёт мне даже в голову не приходило, что и такое может быть :)
Приведи примеры пожалуйста.

Ещё не помешали бы примеры типа как в первом посте, но смесь указателей и ссылок (из реальной жизни).
Iron Bug Дата 30.6.2011, 6:30
 
Цитата(Litkevich Yuriy @ 30.6.2011, 7:42) *
Может список пополнить ещё какими-то родственными объявлениями, кто что помнит?

разве что указатели на функции и массивы функций добавить.
Litkevich Yuriy Дата 30.6.2011, 5:42
  Так надо бы раз и на всегда с этим покончить.
Есть:
1)
const1 char * listnames1

2)
const1 char * const2 listnames2

3)
const1 char * listnames3[]

4)
const1 char * const2 * const3 listnames4[]

"Читаем по слогам" (номера при const - условность):
1) указатель (* listnames1) на константный (const1) char
2) константный указатель (* const2 listnames2) на константный (const1) char
3) массив указателей (* listnames3[]) на константный (const1) char
4) константный массив (const3 listnames4[]) константных указателей (const2 *), на указатель на константный char (const1 char *)

Всё верно?

Может список пополнить ещё какими-то родственными объявлениями, кто что помнит?
Iron Bug Дата 29.6.2011, 14:01
 
Цитата(BRE @ 29.6.2011, 14:51) *
не с конца, а от самого идентификатора, и смотреть в операции слева и справа в зависимости от их приоритета.

я не могу вообразить ни одного примера, чтобы не с конца. "операции" там - функции и массивы(постфиксные) и указатели и ссылки(префиксные). первые имеют приоритет над вторыми. а редкие случаи указателей на функции или массивы разруливаются обычными скобками. в общем, всё равно в итоге выйдет, что с конца :)
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 13.7.2025, 16:45