これはルーキーのように思えるかもしれませんが、Googleにとっては本当に苦しいことです。私はC++を使用していますが、PointersやReferencesで手に入れることができますが、時には私には時にはかなり謎めいています。SomeClass **の差異ptr; SomeClass * ptr;
私はSomeClassName **pointer
の行に沿っていくつかのコードを持っていますが、なぜ1つではなく2つのアスタリスクがあるのでしょうか?
これはルーキーのように思えるかもしれませんが、Googleにとっては本当に苦しいことです。私はC++を使用していますが、PointersやReferencesで手に入れることができますが、時には私には時にはかなり謎めいています。SomeClass **の差異ptr; SomeClass * ptr;
私はSomeClassName **pointer
の行に沿っていくつかのコードを持っていますが、なぜ1つではなく2つのアスタリスクがあるのでしょうか?
写真で説明するのがはるかに簡単ですが、私たちはそれを行っていきます。あなたがすでにこのことのいくつかを知っていれば謝ります。
ポインタは、intまたはcharと同じように、値を保持する単なる変数です。それをポインタにするのは、その変数の値が他の場所のメモリ内のアドレスであるという事実です。
例が簡単です。我々は、我々は以下のようなものを宣言する3つの変数があるとしましょう:
int iVar = 42; // int
int *piVar = &iVar; // pointer to an int
int **ppiVar = &piVar; // pointer to (pointer to an int)
私たちのメモリは次のようになります。
Address Name Value
0x123456 iVar 42
0x12345A piVar 0x123456
0x12345E ppiVar 0x12345A
だから、あなたはあなたができる知っているpiVar間接参照し、次のように:
*piVar = 33;
iVarの値を変更します。
Address Name Value
0x123456 iVar 33
0x12345A piVar 0x123456
0x12345E ppiVar 0x12345A
あなたがppiVarと同じ操作を行うことができます。
*ppiVar = NULL;
Address Name Value
0x123456 iVar 33
0x12345A piVar 0
0x12345E ppiVar 0x12345A
ポインタはまだただの変数であるので、我々は*を使用したアドレスに何であったかの値を変更しました。
なぜですか?
void MyAlloc(int **ppVar, int size)
{
*ppVar = (int *)malloc(size);
}
int main()
{
int *pBuffer = NULL;
MyAlloc(&pBuffer, 40);
}
は(メインで宣言されているように、我々のポインタデリファレンスが変数に取得する方法を参照してください):1つの用途は、関数からメモリを割り当てることですか?それはかなり明確です。
SomeClassName **pointer
は、「SomeClassName
へのポインタ」を意味し、SomeClassName *pointer
は、「SomeClassName
オブジェクトへのポインタ」を意味する。助け
希望、
それはpointer to pointer(s)です。
多分これはあなたがそれを理解する助けになるでしょう:ポインタは、メモリ内の場所を参照する数字です。通常、そのメモリにはあなたのオブジェクトがあります。しかし、この場合、それには別の番号があります。これはメモリ内の別の場所を指し、最終的にはあなたが興味を持っているオブジェクトを持っています。これは不合理な点につながります。あなたは持っている可能性がありますSomeClasName ****pointer.
面白い説明、ありがとう! – krslynx
鮮やかな答えは、これがどのように役立つかという次の質問をクリアします。私が読んでいるコードは意味があります、ありがとう! – krslynx