2012-10-17 47 views
9

循环请知道,我还是很新的C和指针一般...... 这是一类,所以我不要求明确的代码,不仅有助于理解概念。指针和用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]赋值给每个迭代,但相较于2010年告诉我“的表述必须有一个指针类型。”它不是一个指针吗?它作为一个指针传递给函数,对吧?

+1

“我不是要求明确的代码,只是帮助理解概念。” PLUS你没有铸造'malloc()'的返回值 - 这是一个definitve +1。 – 2012-10-17 20:01:54

+0

你的数组的*内容*不是*指向学生结构的指针;它*是*学生结构。因此,在这种情况下丢失' - >'的用法并替换为'。'。 – WhozCraig

+0

我是唯一一个被缺少大括号困扰的人吗? :-) – Massimiliano

回答

7

变化:

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

到:

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

原因:students是指向的struct student阵列。 students[i]是一个实际的struct student。请注意,students[i]实际上相当于*(students + i)

+0

我没有用C编写任何东西,但是我在StackOverflow中看到了很多。为什么“*(学生+我)”工作?为什么这会在地址中添加四个而不是一个? – mowwwalker

+0

编译器“知道”指针的类型,所以当它为指针算术(地址算术)生成代码时,它会添加一个元素的大小。这与数组索引非常相似,只是语法不同。 –

5

学生是一个指针,但是当你的索引,那么你是指的结构的实际情况,所以因此你需要使用.,而不是->访问该结构的场

+4

换句话说,表达式'学生'具有'struct student *'类型,而'studends [i]'具有'struct student'类型。 – cdhowie

3

是不是(学生[我])已经是一个指针了?

号你提领后它(记住:使用数组订阅语法ptr[index]上指针指*(ptr + index)),这将是一个简单的结构,为此,你应该使用.领域的成员存取语法而不是->的其是用于指针结构:

students[i].id = i + 1; 

等应该罚款。

1

Paul的回答将解决您的问题。 但是,既然你要求了解这个概念......

基本上,你所做的是动态分配堆上的数据数组。 现在那个学生是的确是一个指向堆的Student数组的指针。 然而,当你把它称为学生[指数],你实际上是在做这样的

*(students + index) 

你指的是一个学生在实例(学生+指数)的位置的东西。请注意,它已经被取消引用,所以您已经直接引用了该实例。 因此,当你写的学生[指数] - > ID,它是一样的

*(students + index)->id 

应该很清楚你现在这根本就不是正确的语法。 而应该写

students[index].id 

这相当于

(*(students + index)).id 

这实际上意味着:你是递增的指针叫学生们通过指数*的sizeof(学生)在内存中的字节,并访问其id字段。

+2

投入(学生+索引) - > ID以覆盖唯一的选项。 – WhozCraig