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

student 是一个指针,但是当您对其进行索引时,您指的是结构的实际实例,因此您需要使用.而不是->访问该结构中的字段

于 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确实是一个指向堆上Student数组的指针。但是,当您将其称为 student[index] 时,您实际上是在做这样的事情

*(students + index)

您指的是位于 (students + index) 位置的 Student 实例。请注意,它已经被取消引用,因此您已经直接引用了该实例。因此,当你写 students[index]->id 时,它与

*(students + index)->id

您现在应该清楚这根本不是正确的语法。你应该改为写

students[index].id

这相当于

(*(students + index)).id

这实际上意味着:您正在通过内存中的 index * sizeof(Student) 字节递增名为 students 的指针,并访问其 id 字段。

于 2012-10-17T20:09:01.547 回答