0

誰かがこれらのユビキタス間の格差にまっすぐに道を設定することができますか?それは少し気が遠くなる可能性があります。

たとえば、のような2D配列がある場合rec[3][2]、次のアクセスは同じことを意味します。

rec[0][0] = **rec
rec[i][0] = **(rec + i)
*(*(rec + i) + j) = rec[i][j]

これが事実である場合、これらの意味は何ですか:

#include <stdio.h>
double *recptr[3];
int i=1;

main()
{
 double n1=12.0;
 doublw n2=3.4;

 recptr[0]= &n1;
 recptr[1]= &n2;

 printf("Amt: %.2f\n", **(recptr + i));
}

とは何ですか**(recptr + i)、これは2Dポインターまたはポインター間参照へのアクセスですか?

foo(ptr2ptr)double **ptr2ptr;
{
 int i=1, j=0;
 if(**(ptr2ptr +i) > **(ptr2ptr + j))
 {
  double *tmp= *(recptr +i);
 }
}

*(recptr +i)繰り返しますが、との違いは何**(ptr2ptr +i)ですか?!後者も2Dアクセスまたはポインター2ポンター参照へのアクセスであり、オブジェクトが先に指しているのですか?

4

1 に答える 1

1
double *recptr[3];

これにより、doubleへの3つのポインターの配列が作成されます(double*)
さて、にはmain()、doublen1 = 12.0fとdoubleがありn2 = 3.4fます。

ここで、のアドレスを割り当てますn1 (&n1)recptr[0]たまたまdoubleを指している配列の最初の要素なので、これで、double(our n1)のアドレスを指します。これは問題ありません。)->これは参照ではないことに注意してください。 (理論的には)。n1のアドレスを取得しています。

n2でも同じことを行うので、recptr[1]n2のアドレスを指すポインタになります。

今、私たちは印刷します**(recptr + i)->これは次のことを意味します:

配列の最初の要素のアドレスを取得し(recptrはarayのアドレスに評価されます)、このアドレスをi(たまたま1)でオフセットします。ここで、1バイト以上移動するのではなく、バイトをさらに移動することに注意してくださいsizeof(double*)

ここで、*(recptr + i)(最初の要素のアドレス+sizeof(double*)バイト)離れているこの位置を逆参照し、何が表示されますか?ええと、それはdoubleへのポインタです(言い換えれば、それは単にn2のアドレスです)。したがって、この特定のポインタが指す値を実際に確認するには、もう一度逆参照する必要があります。したがって、**(recptr + i)

したがって、最初の逆参照は、recptr配列の正しい「セル」を提供しますが、そのセルにはdoubleへのポインターがあるため、その値を取得するには、もう一度逆参照する必要があります。

(アドレスがrecptr配列の2番目のセルにあるため、実際に3.40を出力します。)

于 2012-04-15T16:31:32.960 に答える