Cに構造体がある場合
typedef struct _a {
int aval;
} a;
a a_inst;
void main() {
a_inst.aval = 5;
}
この例では、a_inst.aval と入力せずに「aval」にアクセスするにはどうすればよいですか?? これは可能ですか?
a_inst.aval
aval
「構造の一部」を指しa_inst
ます。
aval
- あなたが入力したいように - " aval
...?" を参照すると、コンパイラは不機嫌になり、協力を拒否します。
質問への回答: いいえ。
(もちろん、簡略表記の手段として // ポインターを使用し始めた場合を除きます#define
。その時点で、コードが読みにくくなるtypedef
という危険な海域に入る可能性があります。)
ポインターとは別に、#define
またはポインターを使用することはできません。だからあなたはできる
#define AVAL a_inst.aval
また
int * pAval= a_inst.aval
しかし、経験豊富なプログラマーはこれを行いません。
構造体は 1 つだけで構成されているため、次のint
方法で aval を設定できます。
*((int *) &a_inst) = 5;
printf("AVAL %d\n", a_inst.aval);
結果:
AVAL 5
しかし、この種の構造アクセスは使用しないことをお勧めします
これを単純でわかりやすい例として提示するだけです。
私はあなたがこれをやりたいと思っていると仮定しています:
typedef struct _a {
int aval;
} a;
a a_inst;
void main() {
aval = 5; // <-- Access aval without typing a_inst.aval
}
しかし、それは合理的な方法では不可能です。
なんで?
あなたが持っている場合はどうなりますか:
typedef struct _a {
int aval;
} a;
a a_inst;
a b_inst; // Another instance of the a struct
void main() {
aval = 5; // <-- How would the compiler know if aval refers to aval in a_inst or in b_inst?
}
考えられる 1 つの方法は、この構造体フィールドでポインターを使用することです。しかし、あなたは必要になります
void main() {
int *p_aval = &a_inst.aval;
*p_aval=...; //access
}
個人的には、構造名を入力することを好みます。明示的であり、害がなく (入力する文字数が少ないなど)、バグが発生しにくいです。