錯誤訊息:incompatible types for formal and actual parameter
void DisplayTranscriptOne(STUDENT MyScore) // 形參:結構體值
void DisplayTranscriptAll(STUDENT *MyClass) // 形參:指標
void ModifyOne(STUDENT *MyInfo) // 形參:指標
// main 中呼叫
DisplayTranscriptOne(sTranscript); // 實參:陣列 → 退化為指標
DisplayTranscriptAll(*sTranscript); // 實參:解參考 → 結構體值
ModifyOne(*sTranscript); // 實參:解參考 → 結構體值
型別對照表
| 函數 | 形參型別 | main 正確呼叫 | 說明 |
| DisplayTranscriptOne | STUDENT* | DisplayTranscriptOne(sTranscript) 或 &sTranscript[0] | 需指標存取陣列元素 |
| DisplayTranscriptAll | STUDENT* | DisplayTranscriptAll(sTranscript, 10) | 陣列名即首元素指標 |
| ModifyOne | STUDENT* | ModifyOne(sTranscript) | 修改原陣列需指標 |
修正後完整代碼
#include
typedef struct student {
int iNum;
char cName[16];
float fChineseScore, fMathScore, fEnglishScore;
} STUDENT;
void InputTranscript(STUDENT MyClass[], int num) { /* ... */ }
void DisplayTranscriptOne(STUDENT *MyScore) { // ✅ 改為指標
int i;
printf("請輸入需要顯示成績信息的學生的序號:");
scanf("%d", &i);
printf("%d %s %.2f %.2f %.2f\n",
(MyScore + i)->iNum, (MyScore + i)->cName,
(MyScore + i)->fChineseScore, (MyScore + i)->fMathScore,
(MyScore + i)->fEnglishScore);
}
void DisplayTranscriptAll(STUDENT *MyClass, int num) { /* ... */ }
void ModifyOne(STUDENT *MyInfo) { /* ... */ }
int main(void) {
STUDENT sTranscript[10];
InputTranscript(sTranscript, 10);
DisplayTranscriptOne(sTranscript); // ✅ 傳陣列名
DisplayTranscriptAll(sTranscript, 10); // ✅ 傳陣列名
ModifyOne(sTranscript); // ✅ 傳陣列名
return 0;
}
核心規則
- 陣列名在表達式中**自動退化為首元素指標**(
STUDENT*)。
- 函數需修改陣列內容或走訪多個元素 → **形參用指標**。
*sTranscript 是**第一個元素的值**(STUDENT),非指標,不可傳給指標形參。