тип интервала * (*) (интервал *, интервал * (*) ())

интервал * (*) (интервал *, интервал * (*) ())

Я хотел бы знать, какой тип - это?, может кто-то давать пример объявления с помощью этого типа.

любая справка была бы большой.

спасибо.

5
задан Adam Crossland 12 February 2010 в 16:57
поделиться

6 ответов

Это указатель на функцию, которая возвращает 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
19
ответ дан 18 December 2019 в 05:49
поделиться

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
7
ответ дан 18 December 2019 в 05:49
поделиться

Хммм ... согласно cdecl.org , это была синтаксическая ошибка - позвольте мне попробовать

int * (*) (int *,int *(*)())
  • (int *, int () ()) - самый внутренний {{ 1}} (*) () - указатель на функцию int () () - указатель на функцию без параметров, возвращающую указатель на int
  • (int *, .. .) - два параметра, один из которых является указателем на int, а другой - указатель на функцию без параметров, возвращающий указатель на int
  • (*) (...) - a указатель на функцию с параметрами
  • int * (*) (...) - указатель-указатель-возвращающий-указатель-на-int

Итак: Это указатель на функцию, который имеет два параметры, первый параметр которых является указателем на int, а второй - указатель на функцию без параметров, возвращающий указатель на int, и его возвращающий указатель на int.

Изменить: Объявление C, которое я использовал на этом веб-сайте - я не ввел имя переменной, как в

int *(*x)(int *,int *(*)())

, которое вернуло: объявить x как указатель на функцию (указатель на int, указатель на функция, возвращающая указатель на int), возвращающая указатель на int

Надеюсь, это поможет, С уважением, Том.

2
ответ дан 18 December 2019 в 05:49
поделиться

Сайт может "персонализировать" себя, показывая некоторую личную информацию, легко узнаваемый пользователем, на каждой странице. Существует множество способов его реализации. Очевидный: при первом посещении сайт требует, чтобы пользователь загрузил некоторый аватар, и добавляет идентификатор пользователя в файлы 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).

-121--2089601-
typedef int* (*fptr)();    
int* foo(int* p1, fptr p2);

В этот тип можно поместить foo .

0
ответ дан 18 December 2019 в 05:49
поделиться

Такие объявления действительно используются !. Рассмотрим функцию 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, и которая возвращает старая функция сигн.

0
ответ дан 18 December 2019 в 05:49
поделиться

Существует метод, называемый «правилом правого-левого», который может помочь вам расшифровать сложные объявления, подобные этим. Правило работает, заменяя английские ключевые слова на атрибуты, которые появляются в объявлении. Затем, когда вы сложите ключевые слова, построенное предложение будет описывать объявление.

Вот атрибуты и ключевые слова, которые вы должны использовать:

  • Когда вы видите атрибут «()», используйте функцию ключевого слова, которая возвращает «
  • Когда вы видите атрибут« [n] », используйте ключевое слово» массив из n "
  • Когда вы видите атрибут« * », используйте ключевое слово« указатель на »

Теперь вот« правило право-лево »:

  1. Начните с идентификатора.
  2. Найдите атрибут справа.
  3. Если ничего не найдено, посмотрите налево.
  4. Как только атрибут найден, подставьте его ключевое слово на английском языке.
  5. Продолжайте заменять вправо-влево, работая над выходом.
  6. Остановитесь, когда вы дойдете до типа данных в объявлении.

Вот несколько примеров:

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.

1
ответ дан 18 December 2019 в 05:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: