2011-11-09 11 views
4

これはルーキーのように思えるかもしれませんが、Googleにとっては本当に苦しいことです。私はC++を使用していますが、PointersやReferencesで手に入れることができますが、時には私には時にはかなり謎めいています。SomeClass **の差異ptr; SomeClass * ptr;

私はSomeClassName **pointerの行に沿っていくつかのコードを持っていますが、なぜ1つではなく2つのアスタリスクがあるのでしょうか?

答えて

14

写真で説明するのがはるかに簡単ですが、私たちはそれを行っていきます。あなたがすでにこのことのいくつかを知っていれば謝ります。

ポインタは、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つの用途は、関数からメモリを割り当てることですか?それはかなり明確です。

+0

鮮やかな答えは、これがどのように役立つかという次の質問をクリアします。私が読んでいるコードは意味があります、ありがとう! – krslynx

8

SomeClassName **pointerは、「SomeClassNameへのポインタ」を意味し、SomeClassName *pointerは、「SomeClassNameオブジェクトへのポインタ」を意味する。助け

希望、

3

多分これはあなたがそれを理解する助けになるでしょう:ポインタは、メモリ内の場所を参照する数字です。通常、そのメモリにはあなたのオブジェクトがあります。しかし、この場合、それには別の番号があります。これはメモリ内の別の場所を指し、最終的にはあなたが興味を持っているオブジェクトを持っています。これは不合理な点につながります。あなたは持っている可能性がありますSomeClasName ****pointer.

+0

面白い説明、ありがとう! – krslynx

関連する問題