我有这个C程序:
for (i = 0; i < 5; i++)
{
printf( "%d: before flip - \"%s\"", i, word );
flipper(&word[i], &word[i+1], &word[i+2]);
printf( "%d: after flip - \"%s\"", i, word );
}
最后一个printf没有打印出来&#34; mem_address:h&#34;。
相反,它会输出&#34; mem_address:some_random_char&#34;
该行中的 *(&amp; char_array)是如何输出随机字符的呢?
答案 0 :(得分:6)
*(&char_array)
相当于char_array
。在这种情况下,*
和&
会使对方的效果无效。
C11-§6.5.3.2/ 3:
一元
&
运算符生成其操作数的地址。如果操作数的类型为“type”,则结果的类型为“指向类型的指针”。如果操作数是一元*
运算符的结果,则不会对该运算符和&
运算符进行求值,结果就好像两者都被省略,除了对运算符的约束仍然适用且结果不是左值。 [...]
请注意,对于指针数据类型,您应该使用%p
而不是%x
。
答案 1 :(得分:2)
printf("%x : %c\n", char_ptr, *char_ptr);
打印char_ptr
指向的字符,该字符应该是&#39; h&#39;。
printf("%x : %c\n", &char_ar, *(&char_ar));
打印char_ptr
地址的第一个字节,解释为一个字符,该字符应显示为完全随机且不可预测的字符。
答案 2 :(得分:0)
haccks绝对正确,*(&char_ar)
等同于char_ar
,但我还想补充一点,*(&char_ar)
与&*char_ar
不同。
添加这两行以查看差异:
// This is a char**
printf("%p, sizeof(&*char_ar): %d\n", &*char_ar, sizeof(&*char_ar));
// This is a char*[]
printf("%p, sizeof(*(&char_ar)): %d\n", *(&char_ar), sizeof(*(&char_ar)));
See here for a additional explanation
会发布评论,但代码示例会有点多。