使用哈希表访问C中的PHP变量-指针间接寻址级别的更改
我指的是Sara Golemon“扩展和嵌入PHP”。我对下面的片段感到困惑使用哈希表访问C中的PHP变量-指针间接寻址级别的更改,php,c++,c,Php,C++,C,我指的是Sara Golemon“扩展和嵌入PHP”。我对下面的片段感到困惑 zval **fooval; if (zend_hash_find(EG(active_symbol_table), "foo", sizeof("foo"), (void**)&fooval) == SUCCESS) 为什么将计算为zval***的&fooval转换为void**?函数将指针的值指定给指针。它不关心它分配的是什么类型的指针,只关心它得到的是一个指针无效或多或少地表示“通用” 我承认
zval **fooval;
if (zend_hash_find(EG(active_symbol_table), "foo", sizeof("foo"), (void**)&fooval) == SUCCESS)
为什么将计算为
zval***
的&fooval
转换为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;
}
#包括
使用名称空间std;
int main()
{
int i=1;
int*ip=&i;
int**ipp=&ip;
科尔约翰逊说,更好的问题应该是“为什么有人会改变指针的间接级别?”,因为zend_hash是一个“泛型”问题容器接收任何内容,在本例中为zval**…@Cole Johnson同意!感谢@cwallenpole,因为它不关心它分配的指针类型。我假设您无法更改指针的间接级别。尝试int a=5,p1=&a,**p2=&p1;cout