>> [MUSIC CHƠI]
>> DOUG LLOYD: OK.
Chúng tôi đã làm việc với số nguyên, chúng tôi đã làm việc với các nhân vật,
chúng tôi đã làm việc nổi, tăng gấp đôi, dây, và bools.
Chúng tôi đã kiệt sức khá nhiều tất cả của [Không nghe thấy] loại mà
đã được có sẵn cho tất cả chúng ta cùng.
Nhưng bây giờ chúng tôi muốn làm điều gì đó nhiều hơn.
Làm thế nào để chúng tôi làm điều đó?
Làm thế nào để chúng ta tạo ra các loại dữ liệu khác nhau?
Chúng ta có thể làm như vậy bằng cách sử dụng các cấu trúc.
Vì vậy, cấu trúc cho phép chúng tôi để thống nhất biến của các loại khác nhau
thành một kiểu biến mới nhất, mà chúng ta có thể gán tên kiểu riêng của nó.
Đây là một thực sự mạnh mẽ điều để có thể làm được,
bởi vì bây giờ chúng ta có thể nhóm các yếu tố của các loại dữ liệu khác nhau
với nhau mà có một kết nối hợp lý.
Chúng tôi đã có thể làm điều này với mảng loại, phải không?
Chúng tôi có thể biến nhóm của cùng kiểu dữ liệu
cùng nhau trong một đơn vị lớn bộ nhớ, một mảng.
>> Nhưng chúng tôi đã không thể trộn lẫn lưu các loại dữ liệu khác nhau với nhau.
Chúng ta không thể, nói, ghép một số nguyên, và một nhân vật, và một đôi tất cả
trong cùng một điều và gọi đó là một đơn vị duy nhất.
Nhưng với cấu trúc, hoặc thường được gọi là cấu trúc,
chúng tôi thực sự có thể.
Vì vậy, một cấu trúc là loại giống như một biến siêu.
Đó là một biến có chứa biến khác bên trong của nó.
Vì vậy, đây là một ví dụ của một cấu trúc rất đơn giản.
Đây là những gì các cú pháp sẽ xem xét muốn tạo ra một cấu trúc cho một chiếc xe.
Bây giờ, chúng ta hãy đi qua các cú pháp ở đây.
Cấu trúc, đó là từ khóa mà chỉ ra
rằng tôi là tạo ra một kiểu dữ liệu mới đây.
Đặc biệt, tên kiểu dữ liệu là sẽ là cấu trúc xe, như chúng ta sẽ thấy.
Nhưng đây là loại tip off để trình biên dịch rằng đây
là một nhóm các biến đang diễn ra được coi là một phần của cùng một loại
trong một phút.
>> Xe hơi, chỉ là tên của cấu trúc.
Một lần nữa, các kiểu dữ liệu ở đây sẽ được cấu trúc xe, không chỉ xe.
Nhưng nếu bạn có different-- nếu bạn tạo ra nhiều cấu trúc
trong cùng một chương trình, bạn cần phải phân biệt giữa cấu trúc và cấu trúc.
Vì vậy, cấu trúc xe, tôi cũng có thể có struct sinh viên, ví dụ,
trong cùng một chương trình.
Bên trong các dấu ngoặc nhọn là tất cả các trường được gọi là,
hoặc các thành viên của cấu trúc.
Vì vậy, một số trong những điều là gì đó là vốn có trong một chiếc xe hơi?
Vâng, nó thường có một năm, đã một tên mô hình, và một tấm giấy phép,
một đồng hồ đo cây thường có một số số dặm trên đó,
và có thể một kích thước động cơ.
Và như bạn thấy, tôi đang trộn lên số nguyên và các nhân vật và tăng gấp đôi.
Họ đang tất cả sẽ được một phần của kiểu dữ liệu mới này.
>> Cuối cùng, điều cuối cùng tôi cần phải làm, đừng quên dấu chấm phẩy này chút
cuối cùng.
Sau khi chúng tôi hoàn thành việc xác định cấu trúc, chúng ta cần phải đặt một dấu chấm phẩy ở cuối.
Đó là một cú pháp rất phổ biến sai lầm, bởi vì với một chức năng,
Ví dụ, bạn sẽ chỉ phải ngoặc móc mở, nẹp xoăn gần.
Bạn không đặt một dấu chấm phẩy ở kết thúc của định nghĩa hàm.
Điều này có vẻ giống như một chức năng định nghĩa, nhưng nó không phải,
và do đó, các dấu chấm phẩy có chỉ là một lời nhắc nhở rằng bạn
cần phải đặt nó ở đó, bởi vì trình biên dịch sẽ không khác
biết phải làm gì với nó.
Đó là một lỗi rất phổ biến vô tình làm cho
khi bạn lần đầu tiên xác định cấu trúc.
>> ĐƯỢC.
Vì vậy, chúng ta thường xác định cấu trúc của chúng tôi ở đầu rất của các chương trình của chúng tôi
bởi vì có lẽ họ đang đi được sử dụng bởi nhiều chức năng.
Chúng tôi không muốn xác định một tái cấu trúc bên trong của một chức năng,
bởi vì sau đó chúng ta có thể only-- sự Phạm vi của cấu trúc thực sự
chỉ tồn tại bên trong các chức năng đó.
Chúng tôi có thể muốn định nghĩa một cấu trúc vì vậy chúng tôi có thể sử dụng nó trong nhiều chức năng,
hoặc có lẽ trong nhiều các tập tin được gắn liền với nhau
để tạo ra chương trình duy nhất của chúng tôi.
Đôi khi cũng thay xác định cấu trúc
ở đầu rất nơi bạn đặt của bạn bảng bao gồm và bảng Anh của bạn xác định,
Ví dụ, bạn có thể đặt chúng ở file dot h riêng biệt, từ đó bạn
cân cả bản thân mình.
>> Vì vậy, chúng tôi có cấu trúc, nhưng bây giờ chúng ta cần phải nhận được bên trong của họ.
Làm thế nào để chúng tôi đi vào bên trong một cấu trúc để truy cập
những phụ biến, các biến mà tồn tại bên trong cấu trúc?
Vâng, chúng tôi có một cái gì đó gọi là các dấu chấm, cho phép chúng tôi
để truy cập vào các lĩnh vực của cấu trúc.
Vì vậy, ví dụ, chúng ta hãy nói rằng tôi đã tuyên bố gõ cấu trúc dữ liệu của tôi ở đâu đó
ở đầu chương trình của tôi, hoặc có lẽ trong một tập tin dot h mà tôi đã bao gồm bảng Anh.
Nếu tôi sau đó muốn tạo ra một mới biến của kiểu dữ liệu, tôi có thể nói,
struct xe, xe của tôi, dấu chấm phẩy.
Cũng giống như tôi có thể nói int x, hoặc tên chuỗi dấu chấm phẩy.
>> Các kiểu dữ liệu ở đây là cấu trúc xe, tên của các biến là xe của tôi,
và sau đó tôi có thể sử dụng các dấu chấm để truy cập vào các lĩnh vực khác nhau của chiếc xe của tôi.
Vì vậy, tôi có thể nói xe của tôi dot năm bằng năm 2011.
Đó là hoàn toàn tốt đẹp.
Năm, nếu bạn gọi lại, được định nghĩa là một trường số nguyên bên trong của cấu trúc xe này
loại dữ liệu.
Vì vậy, bất kỳ biến của dữ liệu struct xe loại, chẳng hạn như xe của tôi, tôi có thể nói xe của tôi
dot năm bằng và sau đó gán nó một giá trị số nguyên, 2011.
My xe dot tấm bằng CS50.
My thẻ chấm odometer bằng 50.505 dấu chấm phẩy.
Tất cả đều là hoàn toàn tốt đẹp và đó là
làm thế nào chúng ta truy cập các lĩnh vực của cấu trúc.
Kiến trúc, mặc dù, không cần được tạo ra trên stack.
Cũng giống như bất kỳ biến khác, chúng tôi có thể tự động phân bổ cho họ.
Nếu chúng ta có một chương trình mà có thể được tạo ra nhiều cấu trúc,
chúng ta không biết có bao nhiêu chúng ta sẽ cần,
sau đó chúng ta cần phải tự động phân bổ những cấu trúc
như chương trình của chúng tôi đang chạy.
Và vì vậy nếu chúng ta sẽ truy cập các lĩnh vực của một cấu trúc trong bối cảnh đó,
nhớ lại rằng trước tiên chúng ta cần phải tới đích con trỏ đến cấu trúc,
và sau đó một khi chúng ta tới đích của các con trỏ, sau đó chúng ta có thể truy cập vào các lĩnh vực.
Nếu chúng ta chỉ có một con trỏ đến cấu trúc,
chúng ta không thể chỉ nói con trỏ dot trường đặt tên và có được những gì chúng tôi đang tìm kiếm.
Có thêm bước dereferencing.
Vì vậy, chúng ta hãy nói rằng thay vì các previous--
giống như các ví dụ trước, thay vì tuyên bố nó
trên stack, cấu trúc xe, tôi xe, dấu chấm phẩy, tôi nói struct xe,
sao, một con trỏ đến một struct xe được gọi là xe của tôi,
bằng kích thước malloc của cấu trúc xe.
Kích thước của chúng ta sẽ tìm ra bao nhiêu byte kiểu dữ liệu mới của bạn chiếm.
Bạn không nhất thiết chỉ cần sử dụng kích thước của, width, int, char hay, hoặc bất kỳ
của các kiểu dữ liệu được xây dựng trong.
Trình biên dịch là đủ thông minh để tìm ra bao nhiêu byte
được yêu cầu bởi cấu trúc mới của bạn.
Vì vậy, tôi malloc bản thân mình một đơn vị bộ nhớ đủ lớn để chứa một chiếc xe struct,
và tôi nhận được một con trỏ trở lại cho rằng khối của bộ nhớ,
và con trỏ được gán cho chiếc xe của tôi.
>> Bây giờ, nếu tôi muốn truy cập các lĩnh vực xe của tôi,
Đầu tiên tới đích của chiếc xe của tôi, tôi sử dụng các toán tử tham chiếu, ngôi sao
mà chúng tôi đã nhìn thấy từ con trỏ video, và sau đó sau khi tôi tới đích,
sau đó tôi có thể sử dụng các dấu chấm để truy cập vào các lĩnh vực khác nhau của chiếc xe của tôi.
Sao xe của tôi dot năm bằng năm 2011.
Điều đó sẽ có tác dụng chúng tôi muốn trong trường hợp này,
bởi vì chúng tôi đã động giao xe của tôi.
>> Đó là loại gây phiền nhiễu, mặc dù, phải không?
Có một quá trình 2 bước bây giờ.
Bây giờ chúng ta phải dereference-- chúng tôi có một nhà điều hành sao,
và chúng tôi có một dấu chấm.
Và như bạn mong đợi, bởi vì Lập trình C yêu cách ngắn hơn
để làm việc, có một cách ngắn hơn để làm điều này.
Còn có một nhà điều hành được gọi là mũi tên, mà làm cho quá trình này dễ dàng hơn rất nhiều.
Cách mũi tên công trình là nó dereferences đầu tiên
con trỏ vào bên trái bên của các nhà điều hành,
và sau đó, sau khi đã dereferenced con trỏ bên trái,
nó truy cập các lĩnh vực bên phải.
Và như vậy trước đây chúng tôi đã có loại này của sao xe của tôi chấm tất cả các công cụ này,
như đã có rất nhiều xảy ra ở đó.
Nhưng thay vì những gì chúng ta có thể làm là this-- tôi năm xe mũi tên bằng 2011.
>> Một lần nữa, những gì đang xảy ra ở đây?
Đầu tiên, tôi dereferencing xe của tôi.
Mà một lần nữa, là một con trỏ ở đây.
Sau đó, sau khi có dereferenced xe của tôi, tôi
sau đó có thể truy cập vào các lĩnh vực năm, tấm, và odometer
cũng giống như tôi có thể trước khi có đầu tiên sử dụng sao để tới đích của chiếc xe của tôi,
và chấm để truy cập vào các lĩnh vực.
Vì vậy, bạn có thể có cấu trúc, bạn có thể có con trỏ đến cấu trúc,
và bạn có nhiều cách để truy cập các lĩnh vực của những cấu trúc,
cho dù bạn có con trỏ để chúng hoặc các biến bản thân.
Dot hoặc mũi tên, tùy thuộc vào làm thế nào biến được khai báo.
Tôi Doug Lloyd, đây là CS50.