为什么赋予双** **无效**警告?

时间:2014-12-18 15:30:08

标签: c pointers

以下代码完全按预期工作,但编译器给出了不兼容的指针类型警告。演员会解决这个问题,但我真的不明白为什么这应该是一个警告。指针是一个整数,它是某个存储区的地址,在我的例子中,v的地址为d,它是一个整数,似乎全部。请帮我理解这个问题。

#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;
}

1 个答案:

答案 0 :(得分:2)

我想将此作为评论发布,但我仍然没有声誉......: - /

我能想到的少数几件事之一是Pointer Arithmetic。如果所有类型的指针都以相同的方式处理,它将无法工作。因此,指针不仅仅是一个指针,它的类型也很重要。

例如,试试这个:

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++时移动一个地址的原因相同。