(double*)
является листинг; всякий раз, когда вы видите выражение вида (
имя-типа)
выражения, это означает, что «интерпретировать результат выражения как значение типа имя-типа». В этом случае он говорит «интерпретировать результат malloc
как указатель на double
».
Обычно значения указателя одного типа (например, char *
) не могут быть непосредственно отнесены к указателю переменные другого типа (например, double *
), так что вы должны использовать выражение произнесения явно преобразовать значение источника к цели тип. До стандарта 1989 года malloc
, calloc
и realloc
все возвращали значения char *
, поэтому вам пришлось использовать приведение, чтобы присвоить результат другому типу указателя.
Тип void *
был введен в стандарте 1989 в качестве универсального типа указателя, который может быть назначен на различные типы указателей без необходимости гипса, и *alloc
функции была изменена, чтобы возвращать значения этого типа. Явное литье результата malloc
сейчас считается плохой практикой.
Структура типа в выраженном выражении близко соответствует структуре типа в объявлении, просто без имени объявляемой вещи. Это, вероятно, лучше всего объясняется некоторыми примерами.
int *p
объявляет p
в качестве указателя на int
; чтобы передать результат выражения указателю на int
, вы пишете (int *)
. Это то же самое, что и декларация, минус идентификатор p
.
Вот еще несколько примеров:
Declaration Cast Type
----------- ---- ----
int (*ap)[10] (int (*)[10]) Pointer to 10-element array of int
int (*f)(void) (int (*)(void)) Pointer to function returning int
char **p (char **) Pointer to pointer to char
Так опять же, структура выражения приведения такой же, как и структура декларации, минус название вещи объявляются.
Все те же синтаксис. Пробелы несущественны. – EJP
Я мало знаю о downvoting, но кто-то может объяснить, почему сообщение было приостановлено? Я вижу, что описание нисходящего потока: «Этот вопрос не показывает никаких исследований, он неясен или не полезен». Тем не менее, я искал ответ на свой вопрос и не смог его найти. Я заявил, что занимаюсь исследованиями, и думал, что я очень четко понимаю, что я искал. Ответ был полезен для меня в понимании кода, с которым я работаю. Я что-то пропустил? – TZPike05