[音樂播放] 道格·勞埃德:OK。 我們已經與整數工作, 我們與人物的工作, 我們已經工作的花車, 雙打,字符串和布爾變量。 我們已經用盡了幾乎所有的 在[聽不清]類型的 已經提供給我們的所有沿。 但是現在我們想要做的事情更多。 我們該怎麼做呢? 我們如何創建不同類型的數據? 我們可以通過使用結構這樣做。 所以結構使我們能夠統一 不同類型的變量 成一個單一的,新的變量類型, 我們可以將自己的類型名稱。 這是一個非常強大的 事情可以做, 因為我們現在可以組 不同數據類型的要素 一起具有一個邏輯連接。 我們已經能夠做到這一點 數組排序的,對不對? 我們可以把變量 相同的數據類型的 一起在一個大單位 的存儲器,陣列。 但是,我們一直沒能混 向上不同的數據類型一起。 我們不能說,配對的整數, 和性格,和一個雙所有 在同樣的事情, 稱之為一個單元。 但其結構,或 經常被稱為結構, 我們其實可以。 因此,一個結構排序 像一個超級變量。 它是一個包含一個可變 它裡面的其他變量。 所以這裡有一個例子 一個非常簡單的結構。 這是語法將是什麼 想創建一個結構的汽車。 現在,讓我們通過語法在這裡。 結構,這就是 關鍵字,指示 我在這裡創建一個新的數據類型。 具體地,數據類型的名稱是 將是結構的車,因為我們拭目以待。 但是,這是尖的排序 關閉的編譯器,這個 作為一組變量,是要 到被認為是相同類型的一部分 在一分鐘內。 汽車,結構只是名字。 同樣,這裡的數據類型將會 是結構的車,不只是汽車。 但如果你有different-- 如果你創建多個結構 在同一個程序,你需要 結構和結構加以區分。 所以結構的車,我也可以 結構體的學生,例如 在同一程序。 裡面的花括號是 所有的所謂場, 或結構的成員。 那麼,什麼是一些事情 中固有的一個車? 那麼,它通常有一個一年,已 一個型號名稱,車牌, 里程表,通常具有 一些數字就可以了哩, 也許一個發動機尺寸。 正如你所看到的,我是混合起來 整數和字符和雙打。 他們都將是 這個新的數據類型的一部分​​。 最後,最後一件事,我需要做的, 不要忘了這個小分號 在末端。 我們完成定義結構之後, 我們需要把一個分號結尾。 這是一個很常見的語法 錯誤,因為有一個功能, 例如,你只是有 大括號,靠近大括號。 你不把一個分號 函數定義的結束。 這看起來像一個函數 定義,但它不是, 所以分號有 只是提醒你 需要把它放在那裡,因為 編譯器,否則將不 知道該怎麼辦。 這是一個非常常見的錯誤 意外使 當你第​​一次定義結構。 確定。 所以,我們通常定義我們的結構 在我們的節目的最高層 因為他們很可能會 要使用的多種功能。 我們不希望定義一個 結構體在函數中, 因為那時我們就可以only--的 結構的範圍真的 只存在該函數的內部。 我們很可能要定義一個結構 所以我們可以在多個函數使用它, 或者在多個 這是綁在一起的文件 創建我們的一個程序。 有時還代替 限定該結構的 在最高層,你把你的 英鎊包括和你一斤定義, 例如,您可以把它們放在 單獨的點.h文件,然後您再進行 英鎊包括你自己。 因此,我們有結構,但現在 我們需要讓他們的內部。 我們如何獲得內部 一個結構來訪問 那些子的變量,這些變量 該結構內部存在? 好了,我們有一些所謂 點運算符,這使我們 訪問結構的字段。 因此,舉例來說,假設我已經聲明 我的結構化數據類型的地方 在我的節目的頂部,或者在 我已經一斤點.h文件包括在內。 如果我再要創建一個新的 該數據類型的變量,我可以說, 結構的車,我的車,分號。 就像我可以說INT x或字符串名稱分號。 這裡的數據類型是結構的車, 變量的名稱是我的車, 然後我可以使用點操作 訪問我的車的各個領域。 所以我可以說我的車 點的一年相當於2011。 這是完全正常的。 當年,如果你還記得,被定義為 這種結構車內整型字段 數據類型。 結構體的車的數據,所以任何變量 類型,如我的車,我可以說我的車 點的一年相當於然後分配 它的一些整數值,2011年 我的車點板等於CS50。 我的卡點里程表 等於50505分號。 所有這些都 完美的罰款,這就是 我們如何訪問 結構的領域。 結構,但是,並不需要 要在堆棧上創建的。 就像任何其他變量,我們 可以動態分配。 如果我們有一個程序,可能 可以產生許多結構, 我們不知道有多少 我們將需要, 那麼,我們需要動態 分配這些結構 因為我們的程序正在運行。 所以,如果我們要訪問 的結構在該上下文字段, 回想一下,我們首先需要提領 指針的結構中, 再一次,我們取消引用 指針,那麼我們就可以訪問該字段。 如果我們只有一個 指針的結構中, 我們不能只說指針點域 命名並得到我們所要尋找的。 有提領的額外步驟。 因此,讓我們說, 代替previous-- 就像前面的例子, 代替它聲明 在棧中,結構的車,我 汽車,分號,我說的結構車, 明星,一個指針 結構車叫我的車, 等於結構的汽車malloc的大小。 我們大小會找出多少 字節的新的數據類型佔用。 你不一定只需要使用 的,寬度,int或char或任何尺寸 的內置的數據類型。 編譯器是足夠聰明 找出多少字節 需要通過新的結構。 所以我自己的malloc的內存單元 大到足以容納一個結構的汽車, 我得到一個指針回 到存儲器塊, 而該指針被分配給我的車。 現在,如果我想訪問 我的車的領域, 我第一次提領我的車使用 在引用操作,明星 我們已經從指針可見 視頻,然後我提領後, 然後我可以使用點操作 訪問我的車的各個領域。 明星我的車點的一年相當於2011。 這將有效果 我們希望在這種情況下, 因為我們動態地已經 分配我的車。 這還算比較煩人,不過,對不對? 有一個2步現在的過程。 現在我們就來dereference-- 我們有一個星運營商, 我們有一個點操作符。 正如你所期望的,因為 C程序員喜歡短的方式 做的事情,是有 更短的方式來做到這一點。 還有另外一個操作員稱為箭頭 這使得這一過程變得更加簡單。 箭頭的工作方式是 它首先解除引用 左側的指針 操作者側, 然後,在已經廢棄 指針在左邊, 它訪問領域的權利。 所以,以前我們有這種 明星我的車點這一切的東西, 就像有很多事情在那裡。 但是,我們可以做的,而不是為this-- 我的車箭年相當於2011年 同樣,這裡發生了什麼? 首先,我提領我的車。 這再次,是這裡的指針。 然後,將具有後 廢棄我的車,我 然後可以訪問域 今年,板和里程表 只是盡我所能具有第一前 二手星級取消引用我的車, 和斑點訪問該字段。 所以,你可以有結構,你 可以有指針結構, 你有辦法進入 這些結構的領域, 你是否有指針 他們或變量本身。 點或箭頭,這取決於 變量是如何聲明。 我是道格·勞埃德,這是CS50。