2015-02-11 26 views
0

我有一個函數接收作爲參數的結構數組的小問題,當試圖訪問數組元素與運算符 - >我不能訪問的結構數組元素 - >

#include <stdio.h> 

typedef struct{ 
    int order; 
}record; 

void entry(record*reg, size_t num_regs); 

int main(void){ 
    record reg[10]; 
    entry(reg, sizeof reg/sizeof reg[0]); 

    return 0; 
} 

void entry(record*reg, size_t num_regs){ 
    size_t i; 

    for (i = 0; i < num_regs; i++){ 
     reg[i]->order = i; 
     printf("\n order = %d", reg[i]->order); 
    } 
} 

,如果你試圖編譯

*error #2140: Type error in argument 1 to 'ingreso'; expected 'registro * *' but found 'registro *'.* 

,因爲它拋出這個錯誤,以及如何解決它拋出這個錯誤?

+0

問題不在於此代碼中,你如何調用'entry()'? – 2015-02-11 19:05:39

+0

我們需要看到'void entry(...)的調用。)'有任何幫助,但問題駐留在那裏,因爲編譯器抱怨你正在傳遞'registro *'而不是'registro **',可能你有'registers [0]'而不是' &registers [0]'或者你傳遞一個'registro [NUM]'而不是'registro * [NUM]'。 – Jack 2015-02-11 19:06:07

+0

我編輯了添加完整程序的問題 – Kevin 2015-02-11 19:14:04

回答

2

一個struct內訪問數據時,您需要了解->.運營商之間的差異。

  • s.a僅僅是當s是一個structas
  • sp->a成員實際上只是(*sp).a這是一個速記時使用sp是一個指針-TO-struct,我們要取消引用並一步訪問struct的數據。

正如VolAnd說,你正在使用reg[i]->order但你確實應該使用reg[i].order


如果目前還不清楚......

有了您entry()功能,你傳遞10條structs稱爲reg的數組。你可以通過傳遞一個指向數組基地址的指針來實現,所以函數接受一個類型爲record*的指針。

數組的元素是structsstruct指針,所以你reg[i].order,不reg[i]->order訪問它們。

+0

感謝您的詳細解釋。 – VolAnd 2015-02-11 19:47:16

5

當你使用[]指針時,你已經有了一個數據,所以使用。而不是 - >

reg[i].order = i; 

和printf參數一樣。

+1

,因爲它不會與運算符編譯 - > – Kevin 2015-02-11 19:35:49

3

我想你這樣的代碼和整個印刷完全正確的數組:

for (i = 0; i < num_regs; i++){ 
    reg->order = i; 
    printf("\n order = %d", reg->order); 
} 
+1

我的優先級是與運算符I一起工作 - > – Kevin 2015-02-11 19:38:30

+0

刪除像這樣的reg索引:reg - > order = i;我編輯了我的答案 – MHSFisher 2015-02-11 19:42:32

+1

我不認爲這是正確的。最終我們想要訪問'reg [i] .order',因爲'reg'是一個指向數組底部的指針,它也可以寫成'(*(reg + i))。訪問'reg-> order'實際上訪問'(* reg).order',它只是數組中的第一個'struct'。如果你運行這段代碼,你會發現你只能正確初始化第一個'struct'的內容,而其餘的則包含垃圾。 – eigenchris 2015-02-11 19:57:41

0

在這裏你傳遞數組的地址和存儲/收集是在指針。 而且當指針指向數組時,如果使用 - >運算符訪問結構元素,它會將數組視爲指針並將錯誤視爲「錯誤:無效類型參數」 - 「有ârecordâ」。所以你必須使用(。)運算符( - >)運算符的運算符(十六進制)。

for (i = 0; i < num_regs; i++) 
{ 
    reg[i].order = i; 
    printf("\n order = %d", reg[i].order); 
}