指针未在c中给出预期的输出

时间:2018-08-25 04:22:57

标签: c pointers double

为什么double变量不显示垃圾值?
我知道我在玩指针,但是我是故意的。我的代码有什么问题吗?由于指针分配不兼容,它引发了一些警告。

#include "stdio.h"

double y= 0;    
double *dP = &y;    
int *iP = dP;    
void main()
{
    printf("%10#x %#10x %#10x %#10x \n",&y,dP,iP,iP+1);     
    printf("%#10lf %#10lf %#10lf %#10lf \n",y,*dP,*iP,*(iP+1));     
    scanf("%lf %d %d",&y,iP,iP+1);     
    printf("%10#x %#10x %#10x %#10x \n",&y,dP,iP,iP+1);     
    printf("%#10lf %#10lf %#10d %#10d \n",y,*dP,*iP,*(iP+1));
}

Output

1 个答案:

答案 0 :(得分:1)

欢迎使用堆栈溢出。尚不清楚您要使用此代码做什么,但是我要说的第一件事是它确实按照它说的去做。它尝试使用错误的格式字符串格式化数据。结果是垃圾,但这并不一定意味着它会像垃圾一样看起来

如果部分想法是用十六进制打印double的内部位模式,则可以执行此操作-但是代码将取决于实现。以下内容几乎适用于使用doublelong long int类型的64位的任何现代32或64位桌面实现:

double d = 3.141592653589793238;
printf("d = %g = 0x%016llX\n", d, *(long long*)&d);

%g规范是一种以(通常)易于阅读的形式打印double的快速方法。 %llX格式以十六进制打印unsigned long long int。字节顺序与实现有关;即使您知道doublelong long int的位数相同。在Mac,PC或其他Intel / AMD架构计算机上,您将以最高有效位数优先的顺序获得显示。

*(long long *)&d表达式(从右到左读取)将使用d的地址,将double*指针转换为long long *指针,然后将该指针取消引用获取long long值以进行格式化。

本世纪,几乎所有实现都使用IEEE 754格式实现硬件浮点。 64-bit IEEE format (aka double)

您可以在以下位置找到有关printf格式的更多信息: http://www.cplusplus.com/reference/cstdio/printf/