有没有关于指针的文档'兼容类型?

时间:2017-07-25 20:26:18

标签: c++

我试过这个但是没有运气。我已阅读有关指针并使用它们,我知道指向非类型的指针只与相同的指针类型兼容,如

int* apointer = anotherintpointer;

但这是不可能的(不是没有任何明确的转换)

int* apointer = aFLOATpointer;

我确实看到了不允许这一点的观点,但并非完全如此。比如,整数与浮点数兼容,比如int x = afloatvariable;,那么为什么指向int的指针与浮点指针不兼容?

我的主要问题是:我是否有任何地方可以阅读为什么这些指针只与相同的指针类型兼容,以及实际上声明这是真的,因为它只是根据我的经验做出的假设。如果您可以在标准中阅读此内容,请给我一个提示在哪里阅读,因为当我快速浏览它时我找不到它。所以,如果有人能给我一个链接或什么东西,那真的不仅仅是真棒。

修改:根据评论,我可以看到我对 compatible 一词的使用可能有些偏差。我的意思是 compatible 是允许一种类型分配另一种类型:)

2 个答案:

答案 0 :(得分:3)

  

就像,整数与浮点兼容,所以为什么要这样   指向int的指针与浮点指针不兼容?

整数是可转换到浮点数(反之亦然),但是如果你看一下构成RAM中值的实际位,它们就会非常不同。

例如,您的计算机可能使用这32位表示整数值1:

10000000 00000000 00000000 00000000

而“等效”浮点值1.0f通常用这些位表示:

00000000 00000000 10000000 00111111

如果将整数指针设置为指向浮点值(反之亦然),那么,您会发现这些位得到严重错误解释,您将无法获得预期的结果。你可以自己尝试一下,如果你不介意一点点滥用(注意这段代码调用未定义的行为,仅用于教育目的;不要依赖这种行为在其他地方保持一致,不要这样做生产代码中的东西):

 #include <stdio.h>

 int main(int, char **)
 {
    int x   = 1;
    float y = 1;

    float * py = reinterpret_cast<float *>(&x);  // evil!
    printf("y=%f\n", *py);

    int * px = reinterpret_cast<int *>(&y);  // evil!
    printf("x=%i\n", *px);

    return 0;
 }

在我的机器上,上面的代码打印出来:

 y=0.000000
 x=1065353216

......这显然不是人们天真的期待。为了避免像这样无益的运行时行为,编译器阻止你交叉转换指针类型(除非你绝对要求它,例如通过使用reinterpret_cast&lt;&gt;,在这种情况下你最好知道你在做什么:))

答案 1 :(得分:1)

  

整数与浮点兼容,那么为什么指向int的指针与浮点指针不兼容?

整数和浮点数在内存中的表示形式非常不同。它们兼容的唯一原因是编译器提供了一些隐式转换&#34; magic&#34;。当你写

float f = someInt;

编译器为您插入CPU指令,将someInt值转换为float表示。

编译器只能这样做,因为它在编译时知道someIntintffloat。如果你有一个指向float的指针,那就写

float f = *pointerToFloat;

但指针指向int,编译器会认为指针指向float,因为没有其他类型与pointerToFloat相关联。无论指针指向float表示,编译器都必须信任您,因此它最终会将int重新解释为float,并带有完全意外(和未定义)的结果

  

如果您可以在标准中阅读此内容,请给我一个提示,在哪里阅读

the standard有两部分与指针转换有关 - 部分3.7.4.3.2,它解释了安全派生的指针可以是一个明确定义的指针转换的结果和第4.10部分,列出了与原始数据类型相关的三种指针转换。

相关问题