2012-10-17 84 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