Обязательно ли указывать пустой указатель перед назначением ему другого типа указателя? - PullRequest
0 голосов
/ 17 апреля 2020
# include <stdio.h>

int main()
{
    float i = 10, *j;
    void *k;
    k = &i;
    j = k;
    printf("%f", *j);
    return 0;
}

Выше приведен вывод 10.000000 в компиляторе G CC.

Я сомневаюсь, что мы должны написать выражение j = k как j = (float *)k, верно?

1 Ответ

4 голосов
/ 17 апреля 2020

Нет, не требуется. Согласно C11, глава §6.3.2.3,

Указатель на void может быть преобразован в или из указателя на любой тип объекта. Указатель на любой тип объекта может быть преобразован в указатель на void и обратно; результат должен сравниться с исходным указателем.

Таким образом, в вашем случае

k = &i;   // no cast needed
j = k;    // again, no cast needed

функционально совпадает с

j = &i;

Здесь не требуется явное приведение.

...