объяснение указателей c функции - PullRequest
1 голос
/ 26 декабря 2011

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

Dict* dcreate(hash_size size, hash_size (*hashfunc) (const char *));

Здесь я предполагаю, что она передает функцию в качестве параметра со своим параметром в следующей скобке!?

hash_size i = dict->hashfunc(key) % dict->size;

и здесь мое предположение такое же, как и у моей собаки!

hashfunc:

static hash_size def_hashfunc(const char* key){
    hash_size s = 0;
    while(*key){
        s += (unsigned char) *key++;
    }
return s;
}

Спасибо.

Ответы [ 4 ]

3 голосов
/ 26 декабря 2011

Для первой строки ваше предположение верно. Это заголовок для функции, которая принимает два аргумента, один из которых имеет тип hash_size, а другой - указатель на функцию, аргумент которой равен const char* и возвращает hash_size.

Во второй строке dict представляется указателем на структуру, поэтому dict->hashfunc(key) вызывает функцию hashfunc, указатель на которую хранится в структуре dict. Последняя часть (... % dict->size) является просто операцией по модулю.

3 голосов
/ 26 декабря 2011
hash_size (*hashfunc) (const char *)

Указатель функции .

hashfunc - указатель на функцию, которая получает const char * в качестве аргумента и возвращает тип hash_size.

1 голос
/ 26 декабря 2011

Это указатель на функцию

hash_size (*hashfunc) (const char *)

Так что dcreate () выделит Dict и заполнит его поле hashfunc, например:

Dict * dict = (Dict *) malloc(sizeof(Dict));
dict->hashfunc = hashfunc;

Затем вы можете вызвать dict-> hasfunc(const char *), он вернет hash_size.

hash_size i = dict->hashfunc(key) % dict->size;

Это действительно:

hash_size i =  ( dict->hashfunc(key) ) %  ( dict->size ) ; 
1 голос
/ 26 декабря 2011

Он передает только указатель функции в качестве параметра. Ниже приведено определение типа функции, которая должна быть передана:

hash_size (*hashfunc) (const char *)

например. функция, которая получает const char * и возвращает hash_size.

...