解释指针问题的指针
我是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的指针”类型的变量。 - 将
bar
为char**
读取变量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
变量。