c++ - C/C++ 中奇怪的数组到指针的转换

标签 c++ c

看看函数 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/

相关文章:

c++ - 我还是不明白 C++ operator new[] (or new[][])

c - 在 C 中,带有大于 127 的无符号字符的 %s 格式说明符

c - 如何将包含 0 或 1 的字符数组转换为 C 中的小数?

c - 前向替换在 C 中无法正常工作

c++ - 给定一个整数 n,返回它可以表示为 1 和 2 之和的方式的数量

c++ - 子类对象作为虚函数的参数

c - 尝试乘以大整数,但得到 1 的乘积

c - 修改双指针而不使用memset

c++ - 那是内存泄漏吗?

c++ - 在 std::thread 创建的线程中调用 pthread_sigmask 是一种好习惯吗?