【发布时间】:2014-01-10 00:46:42
【问题描述】:
我是 C 的新手,我正在尝试掌握指针。我遇到了这个表情
char *foo = *(char **)bar;
到底发生了什么?我知道 * 是指针 ** 是指向指针的指针,但我真的不明白什么是 *(char **)bar
编辑: 值得一提的是 bar 被声明为 const void *bar
【问题讨论】:
标签: c
我是 C 的新手,我正在尝试掌握指针。我遇到了这个表情
char *foo = *(char **)bar;
到底发生了什么?我知道 * 是指针 ** 是指向指针的指针,但我真的不明白什么是 *(char **)bar
编辑: 值得一提的是 bar 被声明为 const void *bar
【问题讨论】:
标签: c
*(char**)bar;
将bar 转换为指向char 的指针并取消引用,这会导致指向char 的指针(即char*)。
请记住,指针只是间接的。当您取消引用指针时,您会“放下一颗星”,即:
char ***p = ...;
p -> char***
*p -> char**
**p -> char*
***p -> char
【讨论】:
初学者和专家都可以从真正扎实的基础知识中受益。
* 应用于“指向 t 的指针”会生成“t 类型的变量”。那么我们得到了什么?
void *bar = whatever;
char *foo = *(char **)bar;
bar 是“指向 void 的指针”类型的变量。foo 是“指向字符的指针”类型的变量。bar 转换为char** 会读取变量bar 并获取“指向void 的指针”类型的值。然后将该值转换为“指向 char 的指针”类型的值。foo。有意义吗?
【讨论】:
我不知道没有演员表的bar 是什么类型,但这里是:
bar 被转换为指向char 的指针。
(char **) 之前的 * 正在“取消引用”其右侧的值。在这种情况下,它返回由bar 指向的位置指针中保存的char * 指针。
“取消引用”的结果是一个char *——指向一个字符的指针——它被分配给了相同类型的foo变量。
【讨论】: