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
。您应该为要打印的内容使用正确的格式说明符。不要指望侥幸。
我很难理解打印数组时会发生什么。如果我理解正确,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
。您应该为要打印的内容使用正确的格式说明符。不要指望侥幸。