繁体   English   中英

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

[英]Pointer not giving expected output in c

为什么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));
}

产量

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

如果该想法的一部分是打印出十六进制的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位IEEE格式(又名double

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM