переменная указателя определения - PullRequest
1 голос
/ 21 октября 2010

Я не могу понять следующие определения переменной указателя.Вы можете мне помочь?

double(*)(double *) foo;

примечание: извините, я редактирую имя переменной func в foo.

Ответы [ 3 ]

8 голосов
/ 21 октября 2010

Это недопустимо C. Возможно, вы имеете в виду это:

double(*func)(double *);

, который объявляет func как указатель на функцию, которая принимает указатель на double и возвращает double.

Вы можете использовать http://cdecl.org для такого рода вещей.

0 голосов
/ 21 октября 2010

Попробуйте это (проверено):

// functions that take double * and return double
double dfunc(double *d) { return (*d) * 2.0; }

double tfunc(double *d) { return (*d) * 3.0; }

int main()
{
    double val = 3.0;

    double       // 3. the function returns double
    (*pFunc)     // 1. it's a pointer to a function 
    (double *);  // 2. the function takes double *

    pFunc = dfunc;

    printf("%f\n", pFunc(&val)); // calls dfunc()

    pFunc = tfunc;

    printf("%f\n", pFunc(&val)); // calls tfunc()
}

Выход:

6,000000
9.000000

0 голосов
/ 21 октября 2010

это указатель на функцию, возвращающую значение double с параметром указателя типа, равным double, если вы исправите объявление переменной, поскольку в его нынешнем виде просто неправильный правильный синтаксис будет double (*foo) (double*)
, если используется полиморфизмзамените функцию:

struct memory_manager{
    void*(*getmem)(size_t);
    void(*freemem)(void*);
}mem_man; 
void* always_fail(size_t){return 0;}
void* myalloc(size_t s){
    void* p=mem_man.get_mem(s);
    if(p) return p;
    mem_man.getmem=always_fail;
    return 0;
}
void myfree(void* p){
    if(p) freemem(p);
}

на самом деле это не c ++ - способ, которым я geuss, поскольку для большинства целей наследование и виртуальные функции предлагают лучшее решение, но если вы ограничены в c, то вы можете использовать этоТехника для моделирования виртуальных функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...