看看函数 f 中奇怪的一行:
typedef char thing[1];
void f(thing t){
thing *p;
/* Strange line. Changing t to &t is wrong.
C++ require a (thing *) cast.
*/
p = t;
*(*p) = 'C';
}
int main(int argc, char* argv[])
{
thing g;
thing *h;
/* Works as expected. */
h = &g;
g[0] = 'A';
*(*h) = 'B';
f(g);
/* g[0] is now 'C' */
return 0;
}
将 f 更改为
void f(thing t){
char **p;
p = &t; /* note the & */
*(*p) = 'C';
}
也有效。
我原以为 p=&t
是正确的指令,而不是 p=t
。
毕竟 t
是一个 thing
和 &t
必须是 thing*
。
那条奇怪的线发生了什么?
最佳答案
当传递一个数组作为参数时,它会衰减为一个指针。所以f
实际上得到了一个char *
。
然后您尝试取消引用它两次 - 您将它视为指向另一个指针的指针,该指针指向 char
。这不管你怎么做都行不通。
如果你不转换它,C++(和 C,如果你启用警告)会告诉你有问题。如果进行强制转换,实际上是告诉编译器忽略该错误。但这仍然是错误的。
关于c++ - C/C++ 中奇怪的数组到指针的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11180487/