2

私はサラ・ゴレモンの「PHPの拡張と埋め込み」について言及しています。次のスニペットについて混乱しています

zval **fooval;    
if (zend_hash_find(EG(active_symbol_table), "foo", sizeof("foo"), (void**)&fooval) == SUCCESS) 

&foovalに評価される、がzval***にキャストされるのはなぜ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 に答える