9

私はまだCとポインター全般に非常に慣れていないことを知っておいてください...これはクラス用であるため、明示的なコードを求めているのではなく、概念を理解するのに役立つだけです。

構造体内の int にランダムな値を割り当てるループを作成しようとしています。この問題は、ポインターまたは配列の現在の反復に値を割り当てるときに発生します。

struct student{
    int id;
    int score;
};

struct student* allocate(){
    /*Allocate memory for ten students*/
    int ROSTER_SIZE = 10;
    struct student *roster = malloc(ROSTER_SIZE * sizeof(struct student));

    /*return the pointer*/
    return roster;
}

void generate(struct student* students){
    /*Generate random ID and scores for ten students, ID being between 1 and 10, scores between 0 and 100*/
    int i = 0;

    for (i = 0; i < 10; ++i) {
        students[i]->id = i + 1;
        students[i]->score = rand()%101;
}

私の理解では、これはおそらく間違っていますが、 を使用students[i]して各反復に値を割り当てることができるはずですが、VS 2010 では「式にはポインター型が必要です」と表示されます。それはすでにポインターではありませんか?ポインタとして関数に渡されますよね?

4

4 に答える 4

7

変化する:

students[i]->id = i + 1;
students[i]->score = rand()%101;

に:

students[i].id = i + 1;
students[i].score = rand()%101;

理由:studentsの配列へのポインタですstruct studentstudents[i]は実際のstruct studentです。students[i]は実際には と同等であることに注意してください*(students + i)

于 2012-10-17T20:01:46.463 に答える
5

students はポインターですが、インデックスを作成すると、構造体の実際のインスタンスを参照しているため、その構造体のフィールドにアクセスする.代わりに使用する必要があります->

于 2012-10-17T20:02:49.740 に答える
3

(students[i]) は既にポインターではありませんか?

いいえ。それを逆参照した後 (覚えておいてください:ptr[index]ポインターで配列サブスクリプション構文を使用することを意味します!)、構造体へのポインターの代わりにフィールド メンバー アクセサー構文*(ptr + index)を使用する必要がある単純な構造体になります。.->

students[i].id = i + 1;

などでいいはずです。

于 2012-10-17T20:03:41.750 に答える
1

ポールの答えはあなたの問題を解決します。しかし、あなたは概念を理解するよう求めているので...

基本的に、あなたがしたことは、ヒープ上にデータの配列を動的に割り当てることでした。これで、学生は確かにヒープ上の学生の配列へのポインタになりました。ただし、学生[インデックス]と呼ぶと、実際にはこのようなことをしています

*(students + index)

(students + index) の場所にある Student インスタンスを参照しています。すでに参照解除されているため、そのインスタンスを直接参照していることに注意してください。したがって、students[index]->id と書くと、

*(students + index)->id

これが正しい構文ではないことは明らかです。代わりに書くべきです

students[index].id

これはと同等です

(*(students + index)).id

これは実際には、students というポインタをメモリ内の index * sizeof(Student) バイトずつインクリメントし、その id フィールドにアクセスしていることを意味します。

于 2012-10-17T20:09:01.547 に答える