2014-12-18 2 views
4

Следующий код работает точно так, как ожидалось, но компилятор дает мне несовместимое предупреждение типа указателя. Кастинг решит это, но я действительно не понимаю, почему это должно быть предупреждением. Указатель представляет собой целое число, которое является адресом определенной области памяти, и в моем примере 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; 
} 
+6

Указатели не могут быть конвертированы друг в друга. Вы можете преобразовать только в и из 'void *'. –

+5

'void *' - общий тип указателя. 'void **' - нет. Нет общего типа указателя на указатель. –

+1

Чтобы подробно остановиться на комментарии @KeithThompson, вы можете найти этот полезный http://stackoverflow.com/q/25427587/1240985, пытаясь найти больше. Возможно: http://www.nongnu.org/c-prog-book/online/x658.html, я должен перечитать этот. – Morpfh

ответ

2

Я хотел отправить это как комментарий, но я до сих пор не имеют репутацию ...: -/

Одна из немногих вещей, которые я могу думать, это указатель арифметика. Это не сработает, если все типы указателей будут обработаны одинаково. Таким образом, указатель - это не просто указатель, его тип имеет значение.

Например, попробуйте следующее:

short s = 5; 
int i = 6; 
printf("s: 0x%X -> 0x%X\n", &s, (&s)+1); 
printf("i: 0x%X -> 0x%X\n", &i, (&i)+1); 

Выход:

s: 0x270A724E -> 0x270A7250            
i: 0x270A7248 -> 0x270A724C 

Обратите внимание, как s сдвиги два адреса (4E 50, потому что это short) и i сдвиги четыре (от 48 до 4C, потому что это int). С (&s)+1 мы просим переместить одну позицию типа указателя. Вы можете использовать одно и то же для перемещения по массиву без использования []. И это по той же причине, почему char *str заставляет вас двигаться один адрес, когда вы делаете str++.

Смежные вопросы