интервал * (*) (интервал *, интервал * (*) ())
Я хотел бы знать, какой тип - это?, может кто-то давать пример объявления с помощью этого типа.
любая справка была бы большой.
спасибо.
Это указатель на функцию, которая возвращает int*
и принимает int*
и указатель на функцию, которая возвращает int*
(и принимает неопределенное количество параметров; см. комментарии).
Некоторый пример (выглядит не очень красиво, он просто построен так, чтобы содержать упомянутую декларацию):
#include <stdio.h>
static int a = 10;
int* f1() {
return &a;
}
static int b;
int* f2(int *j, int*(*f)()) {
b = *j + *f();
// this is just for demonstrational purpose, such usage
// of global variable makes this function not thread-safe
return &b;
}
int main(int argc, char *argv[]) {
int * (*ptr1)();
int * (*ptr2) (int * , int * (*)());
ptr1 = f1;
ptr2 = f2;
int i = 42;
int *pi = ptr2(&i, ptr1);
printf("%d\n", *pi);
return 0;
}
// prints 52
cdecl
- ваш друг:
$ cdecl explain 'int * (*x) (int * , int * (*)())'
declare x as pointer to function (pointer to int, pointer to function returning pointer to int) returning pointer to int
Хммм ... согласно cdecl.org , это была синтаксическая ошибка - позвольте мне попробовать
int * (*) (int *,int *(*)())
Итак: Это указатель на функцию, который имеет два параметры, первый параметр которых является указателем на int, а второй - указатель на функцию без параметров, возвращающий указатель на int, и его возвращающий указатель на int.
Изменить: Объявление C, которое я использовал на этом веб-сайте - я не ввел имя переменной, как в
int *(*x)(int *,int *(*)())
, которое вернуло: объявить x как указатель на функцию (указатель на int, указатель на функция, возвращающая указатель на int), возвращающая указатель на int
Надеюсь, это поможет, С уважением, Том.
Сайт может "персонализировать" себя, показывая некоторую личную информацию, легко узнаваемый пользователем, на каждой странице. Существует множество способов его реализации. Очевидный: при первом посещении сайт требует, чтобы пользователь загрузил некоторый аватар, и добавляет идентификатор пользователя в файлы cookie. После этого каждый раз, когда пользователь просматривает сайт, аватар показан.
-121--3732505-Я думаю, что вы боретесь с рамками. Данные, поступающие в ракурсы, должны быть созданы в последнюю возможную минуту (LPM).
Исходя из этого, StartList
- это тип для передачи модуля поддержки DropDureList
HTML. Это НЕ место для хранения данных, пока вы решаете, как их обрабатывать.
Лучшим решением будет извлечение данных в список < T >
, а затем инициализация списка
при необходимости. Немедленное преимущество этой практики состоит в том, что она позволяет повторно использовать Список < T >
для нескольких DropDureList
, например:
Country of birth
Country of residence
Эти Списки
используют список стран типа Список < страна >
.
Вы можете использовать Список < T >
в "последнюю минуту", как в этом примере:
public class TaxCheatsFormViewModel
{
private List<Country> countries { get; set; }
public TaxCheat Cheat { get; private set; }
public SelectList CountryOfBirth { get; private set; }
public SelectList CountryOfResidence { get; private set; }
public SelectList CountryOfDomicile { get; private set; }
public TaxCheatsFormViewModel(TaxCheat baddie)
{
TaxCheat = baddie;
countries = TaxCheatRepository.GetList<Country>();
CountryOfBirth = new SelectList(countries, baddie.COB);
CountryOfResidence = new SelectList(countries, baddie.COR);
CountryOfDomicile = new SelectList(countries, baddie.COD);
}
}
Смысл в том, что вы должны сохранить свои данные в списке < T >
, пока вам действительно не потребуется вывести их; последняя возможная минута (LPM).
typedef int* (*fptr)();
int* foo(int* p1, fptr p2);
В этот тип можно поместить foo
.
Такие объявления действительно используются !. Рассмотрим функцию signal стандартной библиотеки C:
void (*
signal(int sig, void (*func)(int)))(int);
на странице руководства по сигналам объясняется, что она эквивалентна следующей версии с определением типов:
typedef void (*sig_t) (int);
sig_t signal(int sig, sig_t func);
Функция, которая принимает два аргумента, int и функцию sig_t, и которая возвращает старая функция сигн.
Существует метод, называемый «правилом правого-левого», который может помочь вам расшифровать сложные объявления, подобные этим. Правило работает, заменяя английские ключевые слова на атрибуты, которые появляются в объявлении. Затем, когда вы сложите ключевые слова, построенное предложение будет описывать объявление.
Вот атрибуты и ключевые слова, которые вы должны использовать:
Теперь вот« правило право-лево »:
Вот несколько примеров:
int n[10];
Идентификатор - n. Атрибут справа - [10]
, поэтому используйте ключевое слово «массив из 10». Затем вы переходите к типу данных int
. Итак,
n - это «массив из 10 целых чисел».
int *n[10];
Идентификатор - n. Атрибут справа - [10]
, поэтому используйте ключевое слово «массив из 10». Посмотрите налево и увидите атрибут *
, поэтому используйте ключевое слово «указатель на». Больше нет атрибутов. Остается только тип данных int
. Сложите ключевые слова вместе, чтобы получить:
n - это «массив из 10 указателей на целые числа».
int (*pf)();
Идентификатор - pf. Сразу справа от pf нет атрибута. Слева от pf находится *
.Итак, первое ключевое слово - «указатель на». Затем вернитесь вправо и получите атрибут ()
. Это означает, что следующее ключевое слово - «функция, которая возвращает». Теперь вернемся влево к типу данных int
. Соедините ключевые слова, чтобы получить:
pf - это «указатель на функцию, которая возвращает int»
int *(*pf)();
pf - это идентификатор. Справа от pf нет атрибутов. Слева - *
, поэтому первое ключевое слово - «указатель на». Справа - ()
, поэтому следующее ключевое слово - «функция, которая возвращает». Сзади слева - *
, поэтому следующее ключевое слово - «указатель на». Затем перейдите к типу данных int
:
pf - это «указатель на функцию, которая возвращает указатель на int».
Следующий пример аналогичен предыдущему, но на этот раз для функции pf есть несколько аргументов. Аргументы: int * x
и int * (* y) ()
. Вы должны уметь описать каждый из этих аргументов на основе всего, что было до сих пор. И как только вы это сделаете, вы сможете описать все:
int *(*pf)(int *x, int *(*y)());
pf - это указатель на функцию, которая возвращает указатель на int. pf принимает два аргумента. Первый аргумент x - указатель на int. Второй аргумент y - это указатель на функцию, которая возвращает указатель на int.