Ответ 1
Звездочка относится к типу возвращаемого значения, а не к имени функции, то есть:
void* func_name(void *param) { . . . . . }
Это означает, что функция возвращает указатель на void.
Я был смущен тем, что я вижу в большинстве программ на C, у которых есть незнакомое объявление функции для меня.
void *func_name(void *param){
...
}
Что означает *
для функции? Мое понимание о (*
) в переменном типе состоит в том, что он создает указатель на другую переменную, таким образом, он может отслеживать, какой адрес, на котором последняя переменная хранится в памяти. Но в этом случае функции я не знаю, что подразумевает эта звездочка *
.
Звездочка относится к типу возвращаемого значения, а не к имени функции, то есть:
void* func_name(void *param) { . . . . . }
Это означает, что функция возвращает указатель на void.
* относится к типу возврата функции, который равен void *
.
Когда вы объявляете переменную-указатель, это то же самое, что и тег *
близок к имени переменной или типу переменной:
int *a;
int* a;
Я лично считаю первый выбор более понятным, потому что, если вы хотите определить несколько указателей с помощью разделителя ,
, вам придется каждый раз повторять *
:
int *a, *b;
Использование синтаксиса "близко к типу" может быть введено в заблуждение в этом случае, потому что если вы пишете:
int* a, b;
Вы объявляете указатель на int (a
) и int (b
).
Итак, вы также найдете этот синтаксис в возвращаемых функциях!
*
относится к типу возврата. Эта функция возвращает void *
, указатель на некоторое расположение памяти неопределенного типа.
Указатель - это тип переменной сам по себе, который имеет адрес некоторой ячейки памяти в качестве ее значения. Различные типы указателей в C представляют разные типы, которые вы ожидаете находиться в памяти, на которую ссылается переменная указателя. Таким образом, ожидается, что int *
будет ссылаться на местоположение, которое может быть интерпретировано как int
. Но void *
- это тип указателя, который относится к местоположению памяти неуказанного типа. Вам нужно будет указать такой указатель на пустоту, чтобы иметь доступ к данным в ячейке памяти, на которую он ссылается.
Это означает, что функция возвращает void*
.