私はサラ・ゴレモンの「PHPの拡張と埋め込み」について言及しています。次のスニペットについて混乱しています
zval **fooval;
if (zend_hash_find(EG(active_symbol_table), "foo", sizeof("foo"), (void**)&fooval) == SUCCESS)
&fooval
に評価される、がzval***
にキャストされるのはなぜ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;
}