【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?

はじめまして。
今回が初質問となります。
お時間がある方はぜひご回答をよろしくお願いいたしますm(_ _)m

C言語を独学で学んでいるため無知なところが多いです...
やさしく、わかりやすく教えて頂ければ幸いです(>_<)


#include<stdio.h>

typedef struct grades {
int number;
char name[20];
double average;
}record;

int main(void) {
int i;

record student1 = {6,"NODA",52.5};
record student2[5] = { {1,"CHIAKI",78.6},{2,"MINE",57.3},{3,"MIKI",66.4},{4,"OKUYAMA",91.4},{5,"SAKU",89.2} };
record *p;
record *s;
p = &student1;
s = &student2[5];

printf("%d %s %5.1f\n\n", p->number, p->name, p->average);

for(i=0; i<5; i++) {
printf("%d %s %5.1f\n", s->number, s->name, s->average);
}

return 0;
}

上記プログラムを実行しますと以下の結果で出力されてしまいます。
6 NODA 52.5

6 NODA 52.5
6 NODA 52.5
6 NODA 52.5
6 NODA 52.5
6 NODA 52.5


ポインタのとこでつまずいている気がするのですが
具体的にどこが悪いのかが分からずに進めずにいます。
(もしポインタでないならすいません...もしかしたらアロー演算子?)


どうか優しい方、ご回答のほどお願いいたします。

A 回答 (4件)

> s = &student2[5];



これは、 student2[5] (student2配列の添字5の要素)に対して&でアドレスを求めることになります。

student2配列の先頭[0]をポインタに入れるなら、
丁寧に書けば
s = &student2[0] ;
配列とポインタが同等に扱われることを利用すれば
s = student2 ;
です。

record student2[5] と宣言したので、添字は0から4であり、 student2[5]は存在しません。
しかし、Cは「6番目」にあたる領域にアクセスしようとします。今回はたまたまそこに student1 の領域があって、&student2[5] == &student1 になったのでしょう。

5回同じ表示になるのは、ループ中でsが変化していないからです。
    • good
    • 0

余談ですが


record student2[5]
に対して
&student2[5]
は完全に合法です.

まったく本題とは関係ありませんが, ねんのため.
    • good
    • 0

s = &student2[0]; // s = &student2[5];



for(i=0; i<5; s++, i++) { // for(i=0; i<5; i++) {
    • good
    • 0

まずは、「どういう動きが正しいのか」を記載しましょう。



プログラムの内容ではなく、やりたいことが判らないと修正しようがないでしょ?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!