C言語の超基礎的内容だと思うのですがどなたか教えてください。
ポインタ変数で宣言した場合の構造体内配列へのアクセス方法です。
typedef struct {
int a;
int b[5];
} arg;
//構造体宣言
arg* _data
float a1 = arg->a;
float b1 = arg->b[0]
?
値が入っていないようです。どなたかお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
そもそもポインタって何、というのを理解していませんね。おっしゃる通り「C言語の超基礎的内容」です。
ポインタ(pointer)という言葉の意味、考えたことがありますか? なにかを指し示すもの、です。説明資料をプロジェクタで写したときに「ココ」と指し示す棒、あれがポインタです(あるいは今どきだとレーザーポインタを使うかも知れませんが)。ポインタ変数は、その棒の役割を持ちます。ココを見てね、と。
(しばしば「ポインタはアドレス」という言い方もします。これは、「指す」ための手段として、コンピュータの構造、メモリのアドレスを使用しているということです。本当はアドレスの話もしたほうがいいのでしょうけれど、それはまたの機会に。)
さて、ポインタ変数を宣言しました。棒の先はどこを指していますか? さあ?わかりません。でも、あなたはポインタで指される先にarg型の構造体があるから、そこのaやb[0]を見ろ、と命令するプログラムを書きました。Cはプログラマに全責任を被せて言われた通りに動く言語です。そこでプログラムは、少なくともarg型は知っているので、指されている先にarg型のデータがあればaやb[0]があるであろう場所を読んで話を進めてしまいます。
棒を取り出して適当な場所を指してそこに文字があれば読む...こっくりさんとかいう占い? 遊びがありましたが、そんなようなことをしてもコンピュータのプログラムとしてまともに動くことは期待できない、おわかりいただけますね。
ポインタは、必ず、意味のあるデータを指すように設定して使わなければいけません。具体的には(既にある回答と話は被りますけれど)
arg ent;
としてarg型の(ポインタではない)変数を宣言して、そこの所在地(&演算子で求められる)をポインタに設定します。
_data = &ent;
そうすると、ポインタはentを指しているので、アロー演算子->や参照演算子*を使ってentの中にあるaとかb[0]にアクセス出来ます。
あるいは、とにかく場所を確保してそこをarg型の構造体として扱う、なんてていう使い方もありますが、いずれ習うので今はまだ置いておきましょう。
なお、「どこも指していない」ということを表すためにNULLという値が定義さてはいます。どこも指していないポインタにはこの値を設定しておくべき、ではあるのですが、C言語は指示されればNULL(普通は使われないはずの0という値)の場所にあるデータを参照しようとします。そうしないようにプログラムを組むのはプログラマの責任です。
余談。
arg* _data;
さて、_dataはどういう変数? と聞かれた時に arg型のポインタ変数...ではなく、arg型'への'ポインタ変数、と言うように心がけてみて下さい。この表現方法はC言語の規格書でも使われています。'への'とすることで「何かを指している」というポインタの意味がより強調されるのではないか、と思います。
投稿2019/10/17 01:14
編集2019/10/17 01:22総合スコア7703
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ポインタを正当な変数で初期化してないからですね。
C
1typedef struct { 2int a; 3int b[5]; 4} arg; 5 6//構造体宣言 7arg* _data; 8 9arg ent; 10_data = &ent; 11 12ent.a = 114514; 13ent.b[1] = 65535; 14 15float a1 = _data->a; 16float b1 = _data->b[1];
こんな感じに使います。
投稿2019/10/16 15:08
編集2019/10/16 15:09総合スコア1722
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
構造体関係なく、宛先が有効先を示していない状態のポインタを使うことはできません。
ちなみに、arg->でなく_data->です。またintとfloatが混在しています。
投稿2019/10/16 15:06
総合スコア4830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。