Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 浮点数组中的指针_C_Arrays_Floating Point - Fatal编程技术网

C 浮点数组中的指针

C 浮点数组中的指针,c,arrays,floating-point,C,Arrays,Floating Point,我对程序的输出有一些疑问 这是我使用的代码- #include<stdio.h> int main() { float a[]={13.24,1.5,1.5,5.4,3.5}; float *j; j=a; j=j+4; printf("%f %f %f\n",j,*j,a[4]); return 0; } #包括 int main() { 浮动a[]={13.24,1.5,1.5,5.4,3.5}; 浮动*j; j=a; j=j+4; printf(“%f%f%f\n”,j,

我对程序的输出有一些疑问

这是我使用的代码-

#include<stdio.h>
int main()
{
float a[]={13.24,1.5,1.5,5.4,3.5};
float *j;
j=a;
j=j+4;
printf("%f %f %f\n",j,*j,a[4]);
return 0;
}
#包括
int main()
{
浮动a[]={13.24,1.5,1.5,5.4,3.5};
浮动*j;
j=a;
j=j+4;
printf(“%f%f%f\n”,j,*j,a[4]);
返回0;
}
我的疑问是,如果我认为J j代表我这里的3.5的地址,因为它最初指向的是[A]的基地址,然后我们添加了4到j。因此,在%d的情况下,j应该打印3.5的地址。如果是%f,还应打印j的地址。在这里我考虑了%d,所以我得到了一个负值,但是如果我使用了%u,那么我就得到了3.5的地址。但在%f的情况下,为什么打印的是值3.500000而不是地址

接下来转到*j,在使用%d时,为什么要打印一些垃圾值?我的意思是它应该根据我的意思打印3,因为我已经使用%d作为浮点值(3.5)

最后,我不明白在[4]的情况下为什么要打印0。a[4]表示3.5,那么为什么不打印呢


请帮忙。谢谢

在C语言中进行类型转换时必须非常小心,因为该语言不能防止错误

实际上,
j
是指向浮点变量的指针(即包含地址)。通常,您从不打印指针或地址,因为这在不同的系统上,甚至在一天中的不同时刻都是不同的

如果仍要打印它,则必须指定它是一个
无符号长
数字,使用printf打印它的格式是“%llu”(=百分比-L-L-U),而不是“%f”或其他任何格式。将来可能会发生这样的情况:长整数不再大到足以包含地址,指针将变成
无符号长
,或者类似的东西。最好不要对C中指针的实现做任何假设

此外,
*j
a[4]
都是浮点变量。使用printf打印这些文件的唯一方法是使用“%f”格式

换言之,如果您要求打印某一类型的变量,告诉printf它是另一种类型,您将在输出中得到垃圾

您的代码可能是这样的,v.gr.:

#include<stdio.h>
int main()
{
float a[]={13.24,1.5,1.5,5.4,3.5};
float *j;
j=a;
j=j+4;
printf("%uul %f %f\n",j,*j,a[4]);
return 0;
}
#包括
int main()
{
浮动a[]={13.24,1.5,1.5,5.4,3.5};
浮动*j;
j=a;
j=j+4;
printf(“%uul%f%f\n”,j,*j,a[4]);
返回0;
}
OP

j
表示我认为这里3.5的地址,因为起初它指向a[]的基址,然后我们在j上加了4

是的,到目前为止还不错

因此,在%d的情况下,j应该打印3.5的地址

否。对于
printf()
%d”
而言,传递的参数应该是
int
,而不是
int*
float*
。对于这种格式不正确的代码,结果是未定义的行为——任何事情都可能发生,而代码的其余部分则无关紧要。启用所有警告以帮助查看此信息

要打印
float*
,请强制转换为
void*
,然后使用
“%p”

如果是%f,还应打印j的地址

不,见上文

在这里我考虑了%d,所以我得到了一个负值,但是如果我使用了%u,那么我就得到了3.5的地址

使用
“%p”
打印对象地址,而不是
“%d”
,也不是
“%u”

但在%f的情况下,为什么打印的是值3.500000而不是地址


如上所述,早期打印使用了不匹配的说明符和参数。任何事情都可能发生。

使用
%f
打印
j
是未定义的行为,输出可能是垃圾。打印指针的正确方法是将指针强制转换为
常量void*
void*
并使用格式说明符
%p
。为什么是[4]同时为%f和%d指定值0?
%f
不是打印浮点数的唯一方法。还有
%g
%e
%a
。此外,还可以使用各种修饰符。如果您需要将指针转换为整数,请包括
并转换为
uintptpr\t
@SGG:当您使用不正确的格式说明符时,编译器/程序会感到困惑。通常,它会在错误的位置查找数据。例如,您告诉它打印一个整数,所以它从整数寄存器中获取数据。但是您传递了一个浮点值,它位于浮点寄存器中。所以打印的数据是完全错误的;它与您传递的值无关。这是唯一一个可能出错的例子。必须使用匹配的格式说明符。
printf("%p\n",(void *) j);