Следующий код работает точно так, как ожидалось, но компилятор дает мне несовместимое предупреждение типа указателя. Кастинг решит это, но я действительно не понимаю, почему это должно быть предупреждением. Указатель представляет собой целое число, которое является адресом определенной области памяти, и в моем примере v имеет адрес d, который является целым числом, и это все кажется. Пожалуйста, помогите мне понять эту проблему.Почему назначение двойного ** на void ** предупреждение?
#include <stdio.h>
#include <stdlib.h>
int main(void) {
double *d;
void **v;
d = malloc(sizeof(double));
*d = 1.1;
printf("%.1f\n", *d);
v = &d;
*(double *)*v = 2.2;
printf("%.1f\n", *d);
return 0;
}
Указатели не могут быть конвертированы друг в друга. Вы можете преобразовать только в и из 'void *'. –
'void *' - общий тип указателя. 'void **' - нет. Нет общего типа указателя на указатель. –
Чтобы подробно остановиться на комментарии @KeithThompson, вы можете найти этот полезный http://stackoverflow.com/q/25427587/1240985, пытаясь найти больше. Возможно: http://www.nongnu.org/c-prog-book/online/x658.html, я должен перечитать этот. – Morpfh