请参阅该计划中的以下几行:
if (ftPtr) {
*ftPtr = feet;
}
请注意feet
double
包含modf()
值。另一方面,ftPtr
是unsigned int
变量的地址。
问题 现在这个程序在没有任何警告的情况下运行良好,但是在我的口中留下了一个不好的味道,即将双值分配给int变量。是否使用C中的地址 kosher 为int变量赋值为double?
#include <stdio.h>
#include <math.h>
void metersToFeetAndInches(double meters, unsigned int *ftPtr, double *inPtr) {
double feet;
double inches;
double rawFeet = meters * 3.281;
inches = modf(rawFeet, &feet);
if (ftPtr) {
*ftPtr = feet;
}
if (inPtr) {
*inPtr = inches;
}
}
int main(int argc, const char * argv[])
{
double meters = 1.80;
unsigned int feet;
double inches;
metersToFeetAndInches(meters, &feet, &inches);
printf("%.2f meters is %d feet and %.2f", meters, feet, inches);
return 0;
}
答案 0 :(得分:4)
是的,这很好。
首先将double
转换为unsigned int
,然后将其存储。就像你写的那样:
if (ftPtr) {
*ftPtr = (unsigned int)feet;
}
答案 1 :(得分:1)
指针只是一个地址:
char pointer
可以指向数据块,可以是任何内容(int
,char
,long
,double
)。但是当您打印它时,您将只看到该数据类型中可包含的数据。
即在这种情况下,如果char指针指向int
,则只会打印1st byte
的{{1}}。没有伤害。
但这不合适,不是你所期望的。
答案 2 :(得分:0)
您可以在unsigned int中存储double,但大小不同。 虽然sizeof(unsigned int)在32位系统中是4,但sizeof(double)是8.所以你可以在4字节长的空间中存储一个8字节长的值,但是可能会丢失数据(上面的4个可以是修剪原来的双倍值。)