1. ホーム
  2. c

[解決済み] ダブルポインタのデリファレンス

2022-02-11 01:49:19

質問

あるコードスニペットがあるのですが、二重の参照を行う行があるため、どのように動作するのか理解することができません。そのコードは次のようなものです。

void afunction(int**x){
    *x = malloc(2 * sizeof(int));
    **x = 12;
    *(*x + 1) = 13;
}

int main(){
    int *v = 10;
    afunction(&v);

    printf("%d %d\n", v[0], v[1]);
    return 1;
}

pointer to pointerの最初の要素が値12を取得することは理解できるのですが、そのあとの行がどうしても理解できないのです。最初のポインタの2番目の要素は値13を取得するのでしょうか?

どのように解決するのですか?

一時的な変数を使用することで、コードを理解するのは簡単です。

void afunction(int**x)
{
    int* t = *x;

    t = malloc(2 * sizeof(int));
    *t = 12;
    *(t+1) = 13;
}

ということで

  • x へのポインタです。 int
  • *x を収めます。 int* (へのポインタ)。 int )
  • **x = というのは *(*x) = へのポインタを取得します。 int そして、デリファレンスによって、そのアドレスに値を設定することができます。

最後の部分 *(*x+1) = は分解することができます。

int* pointerToIntArray = *x;
int* secondElementInArray = pointerToIntArray + 1;
*secondElementInArray = 13;

ここでポインタからポインタへのポインタを使う目的は、アドレスを int* を関数に渡して、関数にメモリを確保させ、データを入れさせることができます。同じ目的は int* , eg:

int* afunction() {
  int* x = malloc(sizeof(int)*2);
  *x = 12;
  *(x+1) = 13;
  return x;
}

int main() {
  int* v = afunction();
  return 0;
}