【问题标题】:Pointers in array of float浮点数组中的指针
【发布时间】:2018-05-02 05:04:09
【问题描述】:

我对程序的输出有些怀疑。

This is the picture where I am using %f to print j, *j and a[4]

In this pisture I've used %d to print j, *j and a[4]

这是我用过的代码-

#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;
}

我的疑问是,如果我考虑 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)。

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

请帮忙。谢谢!

【问题讨论】:

标签: c arrays floating-point


【解决方案1】:

您必须非常小心 C 中的类型转换,因为该语言无法保护您免受错误的影响。

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

如果你想打印它,你必须指定它是一个unsigned long long 数字并且用 printf 打印它的格式是 "%llu" ( = percent-LLU),而不是 "%f" 或其他任何东西。将来可能会发生长整数不再大到足以包含地址,并且指针将变为unsigned long long long,或类似的东西。最好不要对 C 中指针的实现做任何假设。

此外,*ja[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;
}

【讨论】:

  • 打印指针的正确方法是将它们转换为const void *void * 并使用格式说明符%p
  • 为什么 a[4] 的 %f 和 %d 都为 0?
  • %f 不是打印浮点数的唯一方法。还有%g%e%a。此外,还可以使用各种修饰符。
  • 如果您曾经需要将指针转换为整数,请包含&lt;stdint.h&gt; 并转换为uintptr_t
  • @SGG:当您使用不正确的格式说明符时,编译器/程序会感到困惑。通常,它最终会在错误的位置查找数据。例如,你告诉它打印一个整数,所以它从一个整数寄存器中获取数据。但是您传递了一个浮点值,该值位于浮点寄存器中。所以打印出来的数据是完全错误的;它与您传递的值无关。这只是可能出错的一个例子。您必须使用匹配的格式说明符。
【解决方案2】:

操作

...j在我这里代表3.5的地址,因为一开始它指向a[]的基地址,然后我们在j上加了4。

是的,到目前为止一切顺利。

所以在 %d 的情况下,j 应该打印 3.5 的地址。

没有。对于printf()"%d",传递的参数应该是int,而不是int *float *。使用这种格式错误的代码,结果是未定义的行为 - 任何事情都可能发生,其余代码无关紧要。启用所有警告以帮助查看此@n.m.

要打印float *,请转换为void * 并使用"%p"

printf("%p\n",(void *) j);

如果是 %f,它也应该打印 j 的地址。

不,见上文。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-27
    • 2015-08-16
    • 1970-01-01
    • 2018-11-13
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多