2012-04-15 12 views
0

誰かがこれらの間の視差にまっすぐにパスを設定できますか?ポインター・ポインター、ポイント・オブ・ポインテッド・アドレスと2Dアレイ・アクセスの明確さ

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

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ポインタまたはponterツーポインタ参照にこのアクセスですか?

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

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

+0

が重複する可能性を[配列がCでのポインタに名前を付けますか?](http://stackoverflow.com/質問/ 1641957/is-array-name-a-pointer-in-c) –

答えて

1
double *recptr[3]; 

これは、doubleの3つのポインタの配列を作成します。
main()には、n1 = 12.0fの2倍とn2 = 3.4fという2倍の値が設定されています。

n1 (&n1)のアドレスをrecptr[0]に割り当てました(今度は倍精度を指している配列の最初の要素なので、今度はdoubleのアドレス(私たちのn1)を指しています)。これは参考にはならないことに注意してください(理論上)。私たちはn1のアドレスを取っています。

n2と同じことをするので、recptr[1]はn2のアドレスを指すポインタです。

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

我々は、配列の最初の要素のアドレスを取得(recptrがARAYのアドレスに評価される)、私たちは私(それによってこのアドレスをオフセットだけ1になる)。今度は1バイト移動しないことに注意してください。sizeof(double*)バイトをさらに移動します。

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

したがって、最初の逆参照はrecptr配列の正しい "セル"を与えますが、そのセルにはダブルへのポインタがあります。その値に到達するには、もう一度逆参照する必要があります。

(それはアドレスがrecptr配列の2番目のセルに住んでたまたまですので、私たちは、その後、実際に3.40を印刷する。)の

関連する問題