2

我指的是 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**

4

2 回答 2

3

该函数正在分配一个指向指针值的指针。它不关心它分配的是什么类型的指针,只是它正在获取一个指针。void因此,或多或少意味着“通用”。

我承认这是一个严重的过度简化,但与在 PHP 中使用它是一样的:

function foo(stdClass $bar){
   // do something
}

class Bat extends stdClass{

}
$bat = new Bat();
foo((stdClass)$bat);
于 2013-03-13T14:35:06.323 回答
0

可以使用以下代码段解释更改指针间接级别的混淆。

在这种情况下 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;
}
于 2013-03-20T10:50:45.080 回答