1

次の2つのことがcでも同じであることを知っています(オフセットと配列のため)

someArray[i]     //ith element of someArray
*(someArray + i) //ith element of someArray

ただし、構造体の場合、同じ構文はあまりうまく機能しないようです...

someStruct[i]->*(someArray + j)   //compiler error
*(someStruct + i)->someArray[j]   //Also compiler error

構造体の要素を表すためにポインタ/オフセット表記(2番目の表記)を使用する方法はありますか?

4

4 に答える 4

5

が構造someStruct体の配列でありsomeArray、配列型の構造体メンバーであるとすると、次のいずれかが有効になります。

*(someStruct[i].someArray + j)

また

(*(someStruct + i)).someArray[j]

たとえば、http: //ideone.com/UtLN2を参照してください。

于 2012-06-11T20:00:15.950 に答える
1

->特に、メンバー参照演算子を使用する必要がある場合に、ポインター解決演算子を使用しています。.

someStruct []が構造体の配列(ポインターではない)であると仮定します。

*(someStruct[i].someArray + j)
(*(someStruct + i)).someArray[j]
于 2012-06-11T20:02:12.113 に答える
0

私が理解したことから、ポインタ/オフセット演算を使用して構造体のフィールドを表現したいと思います。

構造体または共用体タイプ内のフィールドのオフセットを生成する標準マクロがありoffsetof(type, field)ます。stddef.hfieldtype

たとえば、sタイプがstruct s*で、fがのフィールドであるとしstruct sます。その後*(s + offsetof(struct s, f))、と同じs->fです。

于 2012-06-11T20:10:34.583 に答える
0

これはうまくいくはずです

*(someStruct[i]->someArray + j)

(*(someStruct + i))->someArray[j]

于 2012-06-12T09:28:07.943 に答える