1 00:00:00,000 --> 00:00:02,395 >> [MUSIC CHƠI] 2 00:00:02,395 --> 00:00:05,750 3 00:00:05,750 --> 00:00:06,506 >> DOUG LLOYD: OK. 4 00:00:06,506 --> 00:00:08,880 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, 5 00:00:08,880 --> 00:00:11,930 chúng tôi đã làm việc nổi, tăng gấp đôi, dây, và bools. 6 00:00:11,930 --> 00:00:14,870 Chúng tôi đã kiệt sức khá nhiều tất cả của [Không nghe thấy] loại mà 7 00:00:14,870 --> 00:00:17,100 đã được có sẵn cho tất cả chúng ta cùng. 8 00:00:17,100 --> 00:00:19,430 Nhưng bây giờ chúng tôi muốn làm điều gì đó nhiều hơn. 9 00:00:19,430 --> 00:00:20,210 Làm thế nào để chúng tôi làm điều đó? 10 00:00:20,210 --> 00:00:22,560 Làm thế nào để chúng ta tạo ra các loại dữ liệu khác nhau? 11 00:00:22,560 --> 00:00:26,130 Chúng ta có thể làm như vậy bằng cách sử dụng các cấu trúc. 12 00:00:26,130 --> 00:00:30,180 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 13 00:00:30,180 --> 00:00:34,810 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ó. 14 00:00:34,810 --> 00:00:37,570 Đây là một thực sự mạnh mẽ điều để có thể làm được, 15 00:00:37,570 --> 00:00:40,900 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 16 00:00:40,900 --> 00:00:43,910 với nhau mà có một kết nối hợp lý. 17 00:00:43,910 --> 00:00:46,440 Chúng tôi đã có thể làm điều này với mảng loại, phải không? 18 00:00:46,440 --> 00:00:49,540 Chúng tôi có thể biến nhóm của cùng kiểu dữ liệu 19 00:00:49,540 --> 00:00:53,410 cùng nhau trong một đơn vị lớn bộ nhớ, một mảng. 20 00:00:53,410 --> 00:00:56,660 >> 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. 21 00:00:56,660 --> 00:01:02,610 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ả 22 00:01:02,610 --> 00:01:05,330 trong cùng một điều và gọi đó là một đơn vị duy nhất. 23 00:01:05,330 --> 00:01:08,830 Nhưng với cấu trúc, hoặc thường được gọi là cấu trúc, 24 00:01:08,830 --> 00:01:09,585 chúng tôi thực sự có thể. 25 00:01:09,585 --> 00:01:12,370 Vì vậy, một cấu trúc là loại giống như một biến siêu. 26 00:01:12,370 --> 00:01:16,530 Đó là một biến có chứa biến khác bên trong của nó. 27 00:01:16,530 --> 00:01:19,650 Vì vậy, đây là một ví dụ của một cấu trúc rất đơn giản. 28 00:01:19,650 --> 00:01:23,380 Đâ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. 29 00:01:23,380 --> 00:01:25,250 Bây giờ, chúng ta hãy đi qua các cú pháp ở đây. 30 00:01:25,250 --> 00:01:27,400 Cấu trúc, đó là từ khóa mà chỉ ra 31 00:01:27,400 --> 00:01:30,270 rằng tôi là tạo ra một kiểu dữ liệu mới đây. 32 00:01:30,270 --> 00:01:33,860 Đặ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. 33 00:01:33,860 --> 00:01:36,640 Nhưng đây là loại tip off để trình biên dịch rằng đây 34 00:01:36,640 --> 00:01:42,440 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 35 00:01:42,440 --> 00:01:44,010 trong một phút. 36 00:01:44,010 --> 00:01:46,340 >> Xe hơi, chỉ là tên của cấu trúc. 37 00:01:46,340 --> 00:01:50,590 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. 38 00:01:50,590 --> 00:01:53,060 Nhưng nếu bạn có different-- nếu bạn tạo ra nhiều cấu trúc 39 00:01:53,060 --> 00:01:56,950 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. 40 00:01:56,950 --> 00:02:00,140 Vì vậy, cấu trúc xe, tôi cũng có thể có struct sinh viên, ví dụ, 41 00:02:00,140 --> 00:02:01,790 trong cùng một chương trình. 42 00:02:01,790 --> 00:02:05,980 Bên trong các dấu ngoặc nhọn là tất cả các trường được gọi là, 43 00:02:05,980 --> 00:02:07,954 hoặc các thành viên của cấu trúc. 44 00:02:07,954 --> 00:02:10,370 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? 45 00:02:10,370 --> 00:02:15,270 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, 46 00:02:15,270 --> 00:02:18,000 một đồng hồ đo cây thường có một số số dặm trên đó, 47 00:02:18,000 --> 00:02:19,225 và có thể một kích thước động cơ. 48 00:02:19,225 --> 00:02:23,570 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. 49 00:02:23,570 --> 00:02:26,420 Họ đang tất cả sẽ được một phần của kiểu dữ liệu mới này. 50 00:02:26,420 --> 00:02:29,750 >> 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 51 00:02:29,750 --> 00:02:30,290 cuối cùng. 52 00:02:30,290 --> 00:02:34,380 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. 53 00:02:34,380 --> 00:02:37,325 Đó 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, 54 00:02:37,325 --> 00:02:40,200 Ví dụ, bạn sẽ chỉ phải ngoặc móc mở, nẹp xoăn gần. 55 00:02:40,200 --> 00:02:42,950 Bạn không đặt một dấu chấm phẩy ở kết thúc của định nghĩa hàm. 56 00:02:42,950 --> 00:02:46,430 Đ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, 57 00:02:46,430 --> 00:02:49,653 và do đó, các dấu chấm phẩy có chỉ là một lời nhắc nhở rằng bạn 58 00:02:49,653 --> 00:02:52,440 cần phải đặt nó ở đó, bởi vì trình biên dịch sẽ không khác 59 00:02:52,440 --> 00:02:53,510 biết phải làm gì với nó. 60 00:02:53,510 --> 00:02:56,160 Đó là một lỗi rất phổ biến vô tình làm cho 61 00:02:56,160 --> 00:02:58,570 khi bạn lần đầu tiên xác định cấu trúc. 62 00:02:58,570 --> 00:02:59,500 >> ĐƯỢC. 63 00:02:59,500 --> 00:03:02,824 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 64 00:03:02,824 --> 00:03:05,490 bởi vì có lẽ họ đang đi được sử dụng bởi nhiều chức năng. 65 00:03:05,490 --> 00:03:08,850 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, 66 00:03:08,850 --> 00:03:12,110 bởi vì sau đó chúng ta có thể only-- sự Phạm vi của cấu trúc thực sự 67 00:03:12,110 --> 00:03:13,790 chỉ tồn tại bên trong các chức năng đó. 68 00:03:13,790 --> 00:03:17,450 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, 69 00:03:17,450 --> 00:03:20,670 hoặc có lẽ trong nhiều các tập tin được gắn liền với nhau 70 00:03:20,670 --> 00:03:22,920 để tạo ra chương trình duy nhất của chúng tôi. 71 00:03:22,920 --> 00:03:24,920 Đôi khi cũng thay xác định cấu trúc 72 00:03:24,920 --> 00:03:27,961 ở đầ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, 73 00:03:27,961 --> 00:03:32,080 Ví dụ, bạn có thể đặt chúng ở file dot h riêng biệt, từ đó bạn 74 00:03:32,080 --> 00:03:35,020 cân cả bản thân mình. 75 00:03:35,020 --> 00:03:37,620 >> 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ọ. 76 00:03:37,620 --> 00:03:39,800 Làm thế nào để chúng tôi đi vào bên trong một cấu trúc để truy cập 77 00:03:39,800 --> 00:03:43,530 những phụ biến, các biến mà tồn tại bên trong cấu trúc? 78 00:03:43,530 --> 00:03:46,810 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 79 00:03:46,810 --> 00:03:50,990 để truy cập vào các lĩnh vực của cấu trúc. 80 00:03:50,990 --> 00:03:55,490 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 đó 81 00:03:55,490 --> 00:03:59,020 ở đầ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. 82 00:03:59,020 --> 00:04:03,360 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, 83 00:04:03,360 --> 00:04:06,260 struct xe, xe của tôi, dấu chấm phẩy. 84 00:04:06,260 --> 00:04:11,580 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. 85 00:04:11,580 --> 00:04:18,100 >> 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, 86 00:04:18,100 --> 00:04:23,770 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. 87 00:04:23,770 --> 00:04:27,494 Vì vậy, tôi có thể nói xe của tôi dot năm bằng năm 2011. 88 00:04:27,494 --> 00:04:28,410 Đó là hoàn toàn tốt đẹp. 89 00:04:28,410 --> 00:04:34,210 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 90 00:04:34,210 --> 00:04:35,200 loại dữ liệu. 91 00:04:35,200 --> 00:04:39,966 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 92 00:04:39,966 --> 00:04:44,030 dot năm bằng và sau đó gán nó một giá trị số nguyên, 2011. 93 00:04:44,030 --> 00:04:47,290 My xe dot tấm bằng CS50. 94 00:04:47,290 --> 00:04:51,180 My thẻ chấm odometer bằng 50.505 dấu chấm phẩy. 95 00:04:51,180 --> 00:04:53,270 Tất cả đều là hoàn toàn tốt đẹp và đó là 96 00:04:53,270 --> 00:04:57,802 làm thế nào chúng ta truy cập các lĩnh vực của cấu trúc. 97 00:04:57,802 --> 00:05:00,260 Kiến trúc, mặc dù, không cần được tạo ra trên stack. 98 00:05:00,260 --> 00:05:02,950 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ọ. 99 00:05:02,950 --> 00:05:06,309 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, 100 00:05:06,309 --> 00:05:08,100 chúng ta không biết có bao nhiêu chúng ta sẽ cần, 101 00:05:08,100 --> 00:05:10,800 sau đó chúng ta cần phải tự động phân bổ những cấu trúc 102 00:05:10,800 --> 00:05:12,960 như chương trình của chúng tôi đang chạy. 103 00:05:12,960 --> 00:05:16,600 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 đó, 104 00:05:16,600 --> 00:05:20,660 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, 105 00:05:20,660 --> 00:05:24,810 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. 106 00:05:24,810 --> 00:05:26,830 Nếu chúng ta chỉ có một con trỏ đến cấu trúc, 107 00:05:26,830 --> 00:05:32,120 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. 108 00:05:32,120 --> 00:05:34,259 Có thêm bước dereferencing. 109 00:05:34,259 --> 00:05:36,050 Vì vậy, chúng ta hãy nói rằng thay vì các previous-- 110 00:05:36,050 --> 00:05:38,770 giống như các ví dụ trước, thay vì tuyên bố nó 111 00:05:38,770 --> 00:05:43,680 trên stack, cấu trúc xe, tôi xe, dấu chấm phẩy, tôi nói struct xe, 112 00:05:43,680 --> 00:05:48,020 sao, một con trỏ đến một struct xe được gọi là xe của tôi, 113 00:05:48,020 --> 00:05:51,250 bằng kích thước malloc của cấu trúc xe. 114 00:05:51,250 --> 00:05:54,950 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. 115 00:05:54,950 --> 00:05:58,570 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ỳ 116 00:05:58,570 --> 00:05:59,715 của các kiểu dữ liệu được xây dựng trong. 117 00:05:59,715 --> 00:06:02,090 Trình biên dịch là đủ thông minh để tìm ra bao nhiêu byte 118 00:06:02,090 --> 00:06:04,170 được yêu cầu bởi cấu trúc mới của bạn. 119 00:06:04,170 --> 00:06:09,610 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, 120 00:06:09,610 --> 00:06:12,410 và tôi nhận được một con trỏ trở lại cho rằng khối của bộ nhớ, 121 00:06:12,410 --> 00:06:16,090 và con trỏ được gán cho chiếc xe của tôi. 122 00:06:16,090 --> 00:06:18,050 >> Bây giờ, nếu tôi muốn truy cập các lĩnh vực xe của tôi, 123 00:06:18,050 --> 00:06:22,615 Đầ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 124 00:06:22,615 --> 00:06:26,620 mà chúng tôi đã nhìn thấy từ con trỏ video, và sau đó sau khi tôi tới đích, 125 00:06:26,620 --> 00:06:32,200 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. 126 00:06:32,200 --> 00:06:35,490 Sao xe của tôi dot năm bằng năm 2011. 127 00:06:35,490 --> 00:06:38,480 Điều đó sẽ có tác dụng chúng tôi muốn trong trường hợp này, 128 00:06:38,480 --> 00:06:41,960 bởi vì chúng tôi đã động giao xe của tôi. 129 00:06:41,960 --> 00:06:43,610 >> Đó là loại gây phiền nhiễu, mặc dù, phải không? 130 00:06:43,610 --> 00:06:44,818 Có một quá trình 2 bước bây giờ. 131 00:06:44,818 --> 00:06:47,460 Bây giờ chúng ta phải dereference-- chúng tôi có một nhà điều hành sao, 132 00:06:47,460 --> 00:06:48,910 và chúng tôi có một dấu chấm. 133 00:06:48,910 --> 00:06:51,660 Và như bạn mong đợi, bởi vì Lập trình C yêu cách ngắn hơn 134 00:06:51,660 --> 00:06:53,740 để làm việc, có một cách ngắn hơn để làm điều này. 135 00:06:53,740 --> 00:06:57,790 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. 136 00:06:57,790 --> 00:07:00,750 Cách mũi tên công trình là nó dereferences đầu tiên 137 00:07:00,750 --> 00:07:03,560 con trỏ vào bên trái bên của các nhà điều hành, 138 00:07:03,560 --> 00:07:06,620 và sau đó, sau khi đã dereferenced con trỏ bên trái, 139 00:07:06,620 --> 00:07:09,620 nó truy cập các lĩnh vực bên phải. 140 00:07:09,620 --> 00:07:14,170 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, 141 00:07:14,170 --> 00:07:15,880 như đã có rất nhiều xảy ra ở đó. 142 00:07:15,880 --> 00:07:22,040 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. 143 00:07:22,040 --> 00:07:23,580 >> Một lần nữa, những gì đang xảy ra ở đây? 144 00:07:23,580 --> 00:07:25,720 Đầu tiên, tôi dereferencing xe của tôi. 145 00:07:25,720 --> 00:07:27,810 Mà một lần nữa, là một con trỏ ở đây. 146 00:07:27,810 --> 00:07:31,270 Sau đó, sau khi có dereferenced xe của tôi, tôi 147 00:07:31,270 --> 00:07:35,130 sau đó có thể truy cập vào các lĩnh vực năm, tấm, và odometer 148 00:07:35,130 --> 00:07:40,020 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, 149 00:07:40,020 --> 00:07:42,020 và chấm để truy cập vào các lĩnh vực. 150 00:07:42,020 --> 00:07:45,290 Vì vậy, bạn có thể có cấu trúc, bạn có thể có con trỏ đến cấu trúc, 151 00:07:45,290 --> 00:07:48,360 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, 152 00:07:48,360 --> 00:07:52,600 cho dù bạn có con trỏ để chúng hoặc các biến bản thân. 153 00:07:52,600 --> 00:07:57,640 Dot hoặc mũi tên, tùy thuộc vào làm thế nào biến được khai báo. 154 00:07:57,640 --> 00:08:00,510 Tôi Doug Lloyd, đây là CS50. 155 00:08:00,510 --> 00:08:01,975