这就是我正在运行的:
pam_get_item(pamh, PAM_USER,(const void**)&pam_user);
pamh
是一个对这个问题不重要的结构,pamuser
是一个void指针。此代码编译并成功执行。但是,这不是:
pam_get_item(pamh, PAM_USER,(const **void)&pam_user);
为什么星号会在之前与之后改变意义?谢谢!
答案 0 :(得分:2)
星号是构成该类型名称的组件。并且类型名称的组件顺序会影响它实际的类型。
具体来说,星号会修改类型,使其成为指向左侧任何类型的指针。所以,
void*
这是一个指向void的指针(即指向可能属于任何类型的内存区域的指针)。
const void*
这是一个指向const void
的指针(即指向 const的内存区域的指针,或者应该从该指针的视图中看作const)。< / p>
const void**
这是指向const void*
的指针。
所以,考虑到这一点,你会期望这是什么:
const **void
指向const指针的指针的void?无意义的。
答案 1 :(得分:2)
类型转换运算符为(type)
,其中type
是有效类型。要检查type
的语法是否有意义,请尝试定义type
类型的变量。
(const void**)&pam_user // ok
const void **x; // legal, meaningful
(const **void)&pam_user // wrong
const **void x; // wrong, meaningless
const
符合此处的void
类型。那么const
之后的内容也应该是有效的类型。 ** void
不是有效类型。 <{1}}之后的**
毫无意义。