結構是一個複合數據類型,這意味着它是一個包含其他變量的變量。你熟悉Objective C,所以你可能認爲它有點像'僅數據'類;也就是沒有方法的類。這是將相關信息存儲在一起的一種方式,您可以將它們作爲一個單元傳遞出去。
Typedef是一種讓您將自己的數據類型命名爲C中內置類型的同義詞的方法。它使代碼更具可讀性並允許編譯器捕獲更多錯誤(您正在有效地教導編譯器更多地瞭解你的程序的意圖。)典型的例子是
typedef int BOOL;
(有沒有內置BOOL型老年ANSI C.)
這意味着你現在可以做的事情一樣:
BOOL state = 1;
,並聲明函數採取BOOL
參數,然後讓編譯器確保你通過BOOL
s,即使他們真的只是int
s:
void flipSwitch(BOOL isOn); /* function declaration */
...
int value = 0;
BOOL boolValue = 1;
flipSwitch(value); /* Compiler will error here */
flipSwitch(boolValue); /* But this is OK */
因此,您的typedef正在爲學生記錄結構創建一個同義詞,因此您可以傳遞學生記錄而不必每次都調用它們struct StudentRecord
。它使得代碼更清晰,更易讀。除此之外,在這裏還有更多,在你的例子。我剛纔描述的是:
typedef struct {
char * firstName;
char * lastName;
int id;
float mark;
} StudentRecord;
你現在可以做的事情一樣:
StudentRecord aStudent = { "Angus\n", "Young\n", 1, 4.0 };
或
void writeToParents(StudentRecord student) {
...
}
但你已經得到了的typedef後*
。這是因爲你想輸入一個數據類型來保存指向StudentRecord的指針,而不是typedef StudentRecord本身。嗯?繼續閱讀...
您需要將此指針指向StudentRecord,因爲如果您想要傳遞StudentRecords並能夠修改其成員變量,則需要傳遞指向它們的指針,而不是變量本身。 typedefs對此很好,因爲再一次,編譯器可以捕獲細微的錯誤。上面我們製作了writeToParents
,它只讀取了StudentRecord的內容。說我們想改變他們的成績;我們不能用簡單的StudentRecord參數設置函數,因爲我們不能直接更改成員。因此,我們需要一個指針:
void changeGrade(StudentRecord *student, float newGrade) {
student->mark = newGrade;
}
不難發現,你可能會錯過*,所以反而,類型定義一個指針類型StudentRecord和編譯器會有所幫助:
typedef struct { /* as above */ } *PStudentRecord;
現在:
void changeGrade(PStudentRecord student, float newGrade) {
student->mark = newGrade;
}
這是比較常見的,同時申報兩個:
typedef struct {
/* Members */
} StudentRecord, *PStudentRecord;
這給出了普通的struct typedef和一個指針typedef。
什麼是指針?一個變量,用於保存另一個變量的內存中的地址。聽起來很簡單;它的表面,但它變得非常微妙,並且非常迅速地涉及。嘗試this tutorial
如果是功課,請您可以添加標籤'家庭作業'?它不貶義。謝謝 –
我沒有時間給出完整的答案,但是你說你知道Obj-C?結構就像一個Obj-C類定義,除了它只包含數據 - 從來沒有任何方法。它更像是一個NSDictionary而不是Object。 –
typedef所做的一件事是使它更難以處理該類型的對象(因爲結構類型本身沒有名稱 - 只有指向結構的指針)。因此,這種結構類型的局部變量很難,你只能通過使用指針解引用表達式來獲得結構的大小:'pStudentRecord p = malloc(sizeof(* p));'' –