2012-04-07 3 views
0

私は、呼び出し側が渡したポインタ値を表示する関数を書いています。 私は元の** arr1を台無しにしたくないので、** Pを割り当ててから、それを印刷して数えます。しかし、左辺arr1はゼロになります。ポインタにポインタを代入した後、lvalueがゼロになる理由

コード:

void merge(int **arr1, int **arr2, int **arr3) 
    { 
    int **p1= arr1; 
    int **p2= arr2; 
    int **p3= arr3; 

    int count; 

    printf("%d\n", **arr1); //this shows the correct value of first element of arr1 

    while(**p1) 
    { 
    printf("%d\n", **p1); 
    (*p1)++; 
    count++; 
    } 

    while(**p2) 
    { 
    printf("%d\n", **p2); 
    (*p2)++; 
    count++; 
    } 

    printf("%d\n", **arr1); // this become zero, why??i didn't touch it in my code didn't i? 
    } 

答えて

2

arr1ためと同じことにp1ポイント。したがって、*p1を変更すると、同じオブジェクトであるため、*arr1も変更されます。

+0

である、**p1と同じ値に等しくなければならないが、私は修正しなかった** p1は私にはなかった? –

+0

@qwrqwr: '* p1'を修正したので、他の場所を指しています。だから '** p1'は別のオブジェクトになります。これを紙に描くことが最善のことです。 –

+0

もし私が(* p)++なら、** p1の次の値へポインタを移動するだけですね。 **この変更中に** arr1のアドレスは変更されません。 だから、もし私が** arr1を印刷すると、まだarr1の最初の要素にある。 –

2

前述したように、**p1**arr1は同じ値のintです。

ループを終了し、printfステートメントに降り、**p1はこのループ内で0

に等しくなければならないためには、p1は変更されないさんので、今、あなたは*p1がある、ある、ループwhile(**p1)を持っていますループが終了した後*arr1と同様に、従って、p1arr1は依然として同じ位置を指し、そして**p1したがって0に等しくなる**arr1あなたが正しい0

+0

THanks! とにかくそれを扱うことはありますか? p1がarr1を指していて、p1を変更してもarr1に影響しませんか? –

+0

@qwrqwr: 'p1'の値を変更しても' arr1'には影響しませんが、上のコードでは決して行っていません。すなわち、 'p1 ++'、 'p1 = NULL'、' p1'を変更したり、 'p1'を逆参照することで得られた値を変更しないと、' arr1'には影響しません。また、関数に渡される配列が 'int []'ではなく 'int [] []'ではない場合、double型ではなく単一のポインタだけが必要です。 – AusCBloke

+0

問題は、私の関数がポインタを指すポインタを取っていることです –

関連する問題