Я прочитал следующий программный код:Какой смысл писать (void *) перед целым указателем?
#include <stdio.h>
#include <stdlib.h>
int main() {
int *p;
p= malloc(sizeof(int));
*p=42;
printf("Pointer p has address %p and points to %p\n",
(void*)&p, (void*)p);
free(p);
}
Мой вопрос относится к следующей части:
printf("Pointer p has address %p and points to %p\n", (void*)&p, (void*)p);
Я не понимаю, что (void*)
делает. Это ли? Какой смысл делать это?
В чем отличие вышеуказанного от простого написания следующего?
printf("Pointer p has address %p and points to %p\n", &p, p);
@Sourav Ghoush: Спасибо за ваш ответ. Однако программа также работает без приведения (void *). Таким образом, для% p не нужно указывать указатель на void (вместо, скажем, указателя int), как это не представляется необходимым. –
Иногда вы получаете «счастливый», а UB делает то, что вы ожидаете. – George
@steady_progress: без приведения, поведение * undefined *, так как тип аргумента не совпадает с тем, что ожидает спецификатор преобразования - он может работать, он может и не работать. Если 'sizeof (int *)!= sizeof (void *) ', то вы, вероятно, получите искаженный вывод. –