【问题标题】:explain the pointers to pointers issue解释指针问题的指针
【发布时间】:2014-01-10 00:46:42
【问题描述】:

我是 C 的新手,我正在尝试掌握指针。我遇到了这个表情

char *foo = *(char **)bar;

到底发生了什么?我知道 * 是指针 ** 是指向指针的指针,但我真的不明白什么是 *(char **)bar

编辑: 值得一提的是 bar 被声明为 const void *bar

【问题讨论】:

    标签: c


    【解决方案1】:
    *(char**)bar;
    

    bar 转换为指向char 的指针并取消引用,这会导致指向char 的指针(即char*)。

    请记住,指针只是间接的。当您取消引用指针时,您会“放下一颗星”,即:

    char ***p = ...;
    p    -> char***
    *p   -> char**
    **p  -> char*
    ***p -> char
    

    【讨论】:

      【解决方案2】:

      初学者和专家都可以从真正扎实的基础知识中受益。

      • “t 类型的变量”是一个存储位置,可用于存储或获取 t 类型的
      • pointer to t”是一个
      • 将解引用运算符 * 应用于“指向 t 的指针”会生成“t 类型的变量”。

      那么我们得到了什么?

      void *bar = whatever;
      char *foo = *(char **)bar;
      
      • bar 是“指向 void 的指针”类型的变量。
      • foo 是“指向字符的指针”类型的变量。
      • bar 转换为char** 会读取变量bar 并获取“指向void 的指针”类型的值。然后将该值转换为“指向 char 的指针”类型的值。
      • 解除对该值的引用会产生一个类型为“char 指针”的变量。
      • 然后获取该变量的值,并将该值分配给变量foo

      有意义吗?

      【讨论】:

      • 是的,谢谢,在这种情况下 bar 是 void* 类型,因此转换为 char**
      【解决方案3】:

      我不知道没有演员表的bar 是什么类型,但这里是:

      bar 被转换为指向char 的指针。

      (char **) 之前的 * 正在“取消引用”其右侧的值。在这种情况下,它返回由bar 指向的位置指针中保存的char * 指针。

      “取消引用”的结果是一个char *——指向一个字符的指针——它被分配给了相同类型的foo变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多