Adress of address weirdness(初学者问题)

Adress of adress weirdness (beginner question)

我很难理解打印数组时会发生什么。如果我理解正确,numbers 应该指向数组的第一个元素。 printf("Float:%f \n", (*numbers)); 按预期打印 13.6 。我想我可以通过省略星号来打印地址。

int main(){
    float numbers[5] = {13.6, 2.78, 3.42, 4, 5};

    printf("Int:%n \n", (numbers));
    printf("Float:%f \n", (numbers));
}

输出:

Int:Float:-1.#QNAN0

所以这是第一个混淆点。 为什么我不能将地址打印为整数?

现在,真正让我吃惊的是:

int main(){
    float numbers[5] = {13.6, 2.78, 3.42, 4, 5};

    printf("content: %f\n", numbers[2]);

    printf("Int:%n \n", (numbers));
    printf("Float:%f \n", (numbers));
}

输出:

content: 3.420000
Int:Float:3.420000

什么? 打印 numbers[3] 如何影响数字的值? 这适用于所有 numbers[n],而不仅仅是 2

我刚开始学习 C,非常感谢这里的一些指导(让我知道我是否也可以改进我的问题)。提前致谢!

So this is the first point of confusion. Why can't I just print the address as an Integer?

可以,但需要使用 %p 格式说明符:

printf("Memory Address: %p\n", numbers);

当您使用 %f 时,您是在告诉 printf numbers 是一个浮点数(事实并非如此)。 numbers 是一个指向浮点数组的指针(指针是一个保存内存地址的变量)。

printf 并不聪明,当你告诉它 numbers 是一个浮点数时它会相信你,所以它会尝试将 numbers 的内存地址打印为一个浮点数。内存地址不是有效的浮点数,因此它打印 #QNAN0 ,这意味着 Not A Number.

What? How does printing numbers[3] affect the value of numbers? This works for all numbers[n], not just 2.

当你使用括号时,你是在说“跟随内存地址并给我第 N 个元素”。因此,当您编写 numbers[3] 时,您将返回第三个元素,即 3.42.

至于为什么在你的最后一个例子中 printf("Float:%f \n", (numbers)); 打印第 N 个值?嗯,%f 不是正确的格式说明符,所以它打印 3.42 的事实在 printf.

中是侥幸

我使用 clang C 编译器尝试了您的代码,我也得到了 3.42,但是在 cl(Microsoft 的 C 编译器)上我得到了 0.0。您应该为要打印的内容使用正确的格式说明符。不要指望侥幸。