crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

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


Последние 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 Текстовая версия Сейчас: 28.3.2024, 15:03