*(& char_array)在C中的含义是什么?

时间:2016-03-16 16:05:16

标签: c pointers

我有这个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)是如何输出随机字符的呢?

3 个答案:

答案 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

会发布评论,但代码示例会有点多。