Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用哈希表访问C中的PHP变量-指针间接寻址级别的更改_Php_C++_C - Fatal编程技术网

使用哈希表访问C中的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**?函数将指针的值指定给指针。它不关心它分配的是什么类型的指针,只关心它得到的是一个指针无效或多或少地表示“通用” 我承认

我指的是Sara Golemon“扩展和嵌入PHP”。我对下面的片段感到困惑

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