我指的是 Sara Golemon “扩展和嵌入 PHP”。我对以下代码段感到困惑
zval **fooval;
if (zend_hash_find(EG(active_symbol_table), "foo", sizeof("foo"), (void**)&fooval) == SUCCESS)
为什么&fooval
将评估为 a 的is 转换zval***
为 a void**
?
该函数正在分配一个指向指针值的指针。它不关心它分配的是什么类型的指针,只是它正在获取一个指针。void
因此,或多或少意味着“通用”。
我承认这是一个严重的过度简化,但与在 PHP 中使用它是一样的:
function foo(stdClass $bar){
// do something
}
class Bat extends stdClass{
}
$bat = new Bat();
foo((stdClass)$bat);
可以使用以下代码段解释更改指针间接级别的混淆。
在这种情况下 ipNew 是单级指针,但使用(单或链的)间接运算符,您可以使用它来检索值,直到 '*' 右侧的值是地址
#include<iostream>
using namespace std;
int main()
{
int i = 1;
int* ip = &i;
int** ipp = &ip;
cout<<"i = "<<i<<"\nip = "<<ip<<"\nipp = "<<ipp<<"\n*ip = "<<(*ip)<<"\n**ipp = "<<(**ipp);
int * ipNew = (int *)&ip;
cout<<"\n\ni="<<i<<"\nip="<<ip<<"\nipp="<<ipp<<"\n"<<"*ip="<<(*ip)<<"\n**ipp="<<(**ipp)<<endl<<"\nipNew="<<ipNew<<"\n*ipNew="<<(int *)*ipNew<<"\n**ipNew="<<*((int*)*ipNew)<<endl;
return 0;
}