1

私は2つの構造を持っています:

struct b{int b;float d;}; and 
struct a{int count; struct b* ptr;}
struct a *a_temp;

ここで、タイプ b の 10 個の構造体にメモリを割り当て、アドレスを構造体 a の ptr に入れます。(コードは私に与えられましたが、何らかの理由でダブルポインターを使用したくありませんでした)

a_temp = (struct a*)malloc(sizeof(struct a));
a_temp->ptr = (struct b*)malloc(10*sizeof(struct b));
struct b* b_temp;

タイプ b の 2 番目の構造体のアドレスを temp_b にロードする必要があります。b_temp = a_temp->ptr[1];エラーが発生しているのを試しb_temp = &(a_temp->ptr[1]);ましたが、これを使用してこれを使用して構造 b の内容にアクセスしようとすると機能しますが、これはなぜですか?

前もって感謝します

4

1 に答える 1

3

ptr[1]は構造体であり、ptr + 1(のように*(ptr+1))で示されb_temp、構造体へのポインタを取得するため、のアドレスを渡す必要があります。a_temp->ptr[1]これは。です&a_temp->ptr[1]

expression      | type
---------------------------
a_temp->ptr     | struct b*
a_temp->ptr[1]  | struct b
&a_temp->ptr[1] | struct b*
a_temp->ptr + 1 | struct b*
b_temp          | struct b*

編集:

ポインタがある場合、たとえばint * x、次の式は同じです:x[1]*(x+1)、そしてそれらは両方ともアドレスを尊重しますx+1。言い換えると、これらの式の値は、ポインターが指す変数のタイプです。このx場合はint、変数へのアドレスを保持しているため、この場合はです。xint *intint

于 2011-11-01T12:00:16.383 に答える