🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

2185閲覧

構造体内配列にアクセスする方法

puroguraman

総合スコア20

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/10/16 15:01

C言語の超基礎的内容だと思うのですがどなたか教えてください。
ポインタ変数で宣言した場合の構造体内配列へのアクセス方法です。

typedef struct {
int a;
int b[5];
} arg;

//構造体宣言
arg* _data

float a1 = arg->a;

float b1 = arg->b[0]
?

値が入っていないようです。どなたかお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuma-s

2019/10/16 19:07

値が入っていないことをどのようにして確認しましたか? 編集ボタンを押して、具体的に記述してください。
guest

回答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
thkana

総合スコア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
majiponi

総合スコア1722

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

構造体関係なく、宛先が有効先を示していない状態のポインタを使うことはできません。

ちなみに、arg->でなく_data->です。またintとfloatが混在しています。

投稿2019/10/16 15:06

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問