解释指针问题的指针

我是C的新手,我正试图抓住指针。 我偶然发现了这个表达

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

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

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

初学者和专家都可以从基础知识中获益。

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

那我们得到了什么?

 void *bar = whatever; char *foo = *(char **)bar; 
  • bar是“指向void的指针”类型的变量。
  • foo是“指向char的指针”类型的变量。
  • barchar**读取变量bar并获取“指向void的指针”类型的值。 然后将该值转换为“指向char的指针”类型的值。
  • 取消引用该值会生成“char指针”类型的变量。
  • 然后获取该变量的值,并将该值赋给变量foo

合理?

 *(char**)bar; 

将指针转换为指向char和dereference的指针,这会产生指向char的指针(即char* )。

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

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

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

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

(char **)之前的*是“解除引用”右边的值。 在这种情况下,它将位置指针中保存的char *指针返回到bar

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