[MUSIC CHƠI] DOUG LLOYD: Tất cả các quyền. Làm việc với các đơn biến là khá thú vị. Nhưng nếu chúng ta muốn làm việc với rất nhiều biến số, nhưng chúng tôi không muốn có một bó tên gọi khác nhau bay xung quanh mã của chúng tôi? Trong trường hợp này, mảng là sẽ đi vào thực sự tiện dụng. Mảng là một dữ liệu thực sự cơ bản cấu trúc đối với bất kỳ ngôn ngữ lập trình mà bạn sẽ sử dụng. Và họ thực sự, thực sự hữu ích, đặc biệt, như chúng ta sẽ thấy, trong 50 CS. Chúng tôi sử dụng mảng để giữ giá trị của kiểu dữ liệu tương tự tại các vị trí bộ nhớ kề nhau. Đó là để nói, đó là một cách mà chúng ta có thể nhóm một loạt các số nguyên với nhau trong bộ nhớ hoặc một loạt các nhân vật hoặc nổi trong bộ nhớ thực sự gần nhau và công việc với họ mà không cần phải cung cấp cho mỗi một tên độc đáo riêng của mình, mà có thể nhận được rườm rà sau một thời gian ngắn. Bây giờ, một cách để analogize mảng là để suy nghĩ về bài địa phương của bạn văn phòng cho một thứ hai. Vì vậy, bước ra từ chương trình và chỉ cần nhắm mắt lại và hình dung trong tâm trí của bạn bưu điện địa phương của bạn. Thông thường, trong hầu hết các bài văn phòng, có một ngân hàng lớn một hộp bưu điện trên tường. Một mảng là một khối khổng lồ bộ nhớ kề, cùng một cách mà một mail ngân hàng tại văn phòng đăng bài của bạn là một không gian rộng lớn trên tường của bưu điện. Mảng đã được phân chia thành nhỏ, hệt khối với kích thước của không gian, mỗi trong số đó được gọi là một yếu tố, trong cùng một cách mà các bức tường của các bài văn phòng đã được phân chia thành nhỏ, hệt khối với kích thước của không gian, mà chúng ta gọi là hộp PO. Mỗi phần tử của mảng có thể lưu trữ một số tiền nhất định của dữ liệu, cũng giống như mỗi hộp bưu điện có thể tổ chức một số tiền nhất định của mail. Những gì có thể được lưu trữ trong mỗi phần tử của mảng là biến của cùng một dữ liệu loại, chẳng hạn như int hoặc char, chỉ giống như trong hộp bưu điện của bạn, bạn chỉ có thể phù hợp với điều các loại tương tự, như thư hoặc các gói nhỏ. Cuối cùng, chúng ta có thể truy cập mỗi phần tử của các mảng trực tiếp theo số chỉ mục, cũng như chúng ta có thể truy cập vào văn phòng của chúng tôi bài hộp bằng cách biết số hộp thư của mình. Hy vọng rằng, tương tự mà giúp bạn có được đầu của bạn xung quanh ý tưởng của mảng bằng analogizing đến cái gì khác rằng bạn có lẽ đã quen thuộc với. Trong C, các yếu tố của một mảng được lập chỉ mục bắt đầu từ 0, không phải từ 1. Và điều này thực sự quan trọng. Và trên thực tế, đây là lý do tại sao chúng tôi, trong CS 50, và lý do tại sao máy tính của các nhà khoa học thường xuyên sẽ đếm từ 0, là vì mảng C lập chỉ mục, mà luôn luôn bắt đầu từ 0. Vì vậy, nếu một mảng gồm n phần tử, phần tử đầu tiên của mảng đó nằm ở chỉ số 0, và phần tử cuối cùng của mảng nằm ở chỉ số n trừ đi 1. Một lần nữa, nếu có n phần tử trong chúng tôi mảng, chỉ số cuối cùng là n trừ đi 1. Vì vậy, nếu mảng của chúng tôi có 50 yếu tố, các Yếu tố đầu tiên nằm ở chỉ số 0, và yếu tố cuối cùng tọa lạc tại số 49. Thật không may, hoặc may mắn thay, tùy thuộc vào quan điểm của bạn, C là rất khoan dung ở đây. Nó sẽ không ngăn cản bạn đi ra ngoài giới hạn của mảng của bạn. Bạn có thể truy cập trừ 3 yếu tố của mảng của bạn hoặc các yếu tố thứ 59 của mảng của bạn, nếu mảng của bạn chỉ có 50 phần tử. Nó sẽ không ngừng chương trình của bạn từ biên soạn, nhưng trong thời gian chạy, bạn có thể gặp một sợ hãi lỗi segmentation nếu bạn bắt đầu truy cập vào bộ nhớ đó là ngoài giới hạn của những gì bạn hỏi chương trình của bạn để cung cấp cho bạn. Vì vậy, hãy cẩn thận. Những gì hiện một mảng khai báo như thế nào? Làm thế nào để chúng ta viết mã một mảng vào sự tồn tại như chúng ta viết mã bất kỳ biến nào khác? Có ba phần để một mảng declaration-- một kiểu, một tên, và kích thước. Điều này là rất tương tự như một khai báo biến, mà chỉ là một loại và một tên, các yếu tố kích thước là trường hợp đặc biệt cho một mảng, bởi vì chúng ta đang nhận được một bó của họ cùng một lúc. Vì vậy, loại này là loại biến bạn muốn mỗi phần tử của mảng được. Do muốn nó vào một mảng các số nguyên? Sau đó, kiểu dữ liệu của bạn nên là int. Bạn có muốn nó là một mảng tăng gấp đôi hoặc phao nổi? Kiểu dữ liệu phải được gấp đôi hoặc thả nổi. Tên bạn là gì muốn gọi mảng của bạn. Điều gì làm bạn muốn đặt tên khổng lồ này ngân hàng số nguyên hoặc phao hoặc ký tự hoặc tăng gấp đôi, hoặc bất cứ điều gì bạn có? Làm những gì bạn muốn gọi nó? Khá tự giải thích. Cuối cùng, kích thước, mà đi bên trong dấu ngoặc vuông, là bao nhiêu yếu tố bạn sẽ như mảng để chứa. Có bao nhiêu số nguyên nào bạn muốn? Làm thế nào nhiều phao nào bạn muốn? Vì vậy, ví dụ, int lớp học 40. Này khai báo một mảng gọi là sinh viên lớp, trong đó bao gồm 40 số nguyên. Khá tự giải thích, tôi hy vọng. Dưới đây là một ví dụ khác. Giá đơn đôi 8. Điều này tạo ra một mảng gọi là Giá Menu, trong đó bao gồm các phòng trong bộ nhớ cho tám đôi. Nếu bạn nghĩ về từng yếu tố của một mảng của kiểu dữ liệu kiểu, ví dụ như vậy, một yếu tố duy nhất của một mảng kiểu int, giống như cách bạn sẽ nghĩ ra bất kỳ khác biến kiểu int, tất cả các hoạt động quen thuộc mà chúng ta thảo luận trước đây trong các hoạt động video sẽ làm cho tinh thần. Vì vậy, ở đây, chúng ta có thể khai báo một mảng các phép toán luận gọi là Truthtable, trong đó bao gồm phòng trong 10 Boolean. Và sau đó, giống như chúng ta chỉ có thể gán một giá trị cho bất kỳ biến khác của loại Boolean, chúng ta có thể nói điều gì đó như Truthtable khung vuông 2, đó là cách chúng tôi đã chỉ ra, trong đó yếu tố của bảng sự thật? Yếu tố thứ ba của bảng sự thật, vì nhớ, chúng tôi đang đếm từ 0. Vì vậy, đó là cách chúng tôi chỉ ra Yếu tố thứ ba của bảng sự thật. Truthtable 2 bằng giả, giống như chúng ta có thể declare-- hoặc chúng tôi có thể chuyển nhượng, thay vào đó, bất kỳ Biến kiểu Boolean là sai lầm. Chúng tôi cũng có thể sử dụng nó trong điều kiện. if (truthtable 7 == true), mà là để nói, nếu các yếu tố thứ tám của Truthtable là sự thật, có lẽ chúng ta muốn in một tin nhắn cho người sử dụng, printf ("TRUE n!") ;. Điều đó khiến chúng tôi phải nói Truthtable 10 bằng sự thật, đúng không? Vâng, tôi có thể, nhưng nó đẹp nguy hiểm, vì nhớ, chúng tôi có một mảng của 10 Boolean. Vì vậy, các chỉ số cao nhất mà trình biên dịch đã cho chúng ta là 9. Chương trình này sẽ biên dịch, nhưng nếu cái gì khác trong bộ nhớ tồn tại nơi mà chúng tôi sẽ mong Truthtable 10 để đi, chúng ta có thể chịu đựng một lỗi phân khúc. Chúng tôi có thể nhận được ngay với nó, nhưng nói chung, khá nguy hiểm. Vì vậy, C pháp lý những gì tôi đang làm ở đây là, nhưng không nhất thiết phải di chuyển tốt nhất. Bây giờ, khi bạn khai báo và khởi tạo một mảng đồng thời, có thực sự là một khá cú pháp đặc biệt mà bạn có thể sử dụng để điền vào mảng với các giá trị khởi đầu của nó. Nó có thể nhận được rườm rà để khai báo một mảng có kích thước 100, và sau đó có thể nói, phần tử 0 bằng này; 1 phần tử bằng này; phần 2 bằng đó. Điểm là gì, phải không? Nếu đó là một mảng nhỏ, bạn có thể làm một cái gì đó như thế này. Bool truthtable 3 bằng mở ngoặc móc và sau đó dấu phẩy tách danh sách các yếu tố mà bạn muốn đưa vào mảng. Sau đó đóng xoăn cú đúp dấu chấm phẩy. Điều này tạo ra một mảng của kích thước ba gọi Truthtable, với các yếu tố sai, sự thật, và sự thật. Và trên thực tế, các instantiation cú pháp tôi có ở đây là chính xác giống như làm cú pháp yếu tố cá nhân dưới đây. Hai cách mã hóa sẽ sản xuất các mảng chính xác như nhau. Tương tự như vậy, chúng ta có thể lặp trên tất cả các yếu tố của một mảng bằng cách sử dụng một vòng lặp, trong đó, Trên thực tế, là một đề nghị rất mạnh mẽ tại nhà tập thể dục. Làm thế nào để bạn tạo ra một mảng 100 số nguyên, nơi mọi phần tử của mảng là chỉ số của nó? Vì vậy, ví dụ, chúng ta có một mảng của 100 số nguyên, và trong các yếu tố đầu tiên, chúng tôi muốn đặt 0. Trong các yếu tố thứ hai, chúng tôi muốn đặt 1. Trong các yếu tố thứ ba, chúng tôi muốn để đặt 2; và vv và vv. Đó là một thực sự tốt tại nhà tập thể dục để làm điều đó. Ở đây, nó không giống như quá nhiều thay đổi. Nhưng chú ý rằng ở giữa dấu ngoặc vuông, thời gian này, Tôi đã thực sự bỏ qua các số. Nếu bạn đang sử dụng này rất instantiation đặc biệt Cú pháp để tạo ra một mảng, bạn thực sự làm không cần phải biết kích thước của mảng trước. Trình biên dịch là đủ thông minh để biết rằng bạn thực sự muốn một mảng có kích thước 3, bởi vì bạn đặt ba yếu tố bên phải dấu bằng. Nếu bạn đã đặt bốn, nó sẽ có đưa cho bạn một bảng sự thật của kích thước bốn; và vv và vv. Mảng được không riêng cho một đơn kích thước, mà là khá mát mẻ. Bạn thực sự có thể có nhiều specifiers phía như bạn muốn. Vì vậy, ví dụ, nếu bạn muốn tạo một hội đồng quản trị cho các trò chơi Battleship, trong đó, nếu bạn từng chơi, là một trò chơi mà là chơi với chốt trên 10 bởi 10 lưới, bạn có thể tạo ra một mảng như thế này. Bạn có thể nói Bool khung vuông 10 chiến hạm đóng khung vuông vuông khung 10 đóng khung vuông. Và sau đó, bạn có thể chọn để giải thích điều này trong tâm trí của bạn như là một 10 10 lưới của các tế bào. Bây giờ, trên thực tế, trong bộ nhớ, nó thực sự chỉ vẫn là một yếu tố 100, đơn mảng chiều. Và điều này, trên thực tế, nếu bạn đi cho có ba kích thước hoặc bốn hoặc năm. Nó thực sự chỉ cần nhân tất cả các indices-- hoặc tất cả các kích thước specifiers-- với nhau, và bạn chỉ nhận được một chiều mảng có kích thước đó. Nhưng về mặt tổ chức và hình dung và nhận thức của con người, nó có thể được dễ dàng hơn rất nhiều để làm việc với một mạng lưới nếu bạn đang làm việc trên một trò chơi như Tic-tac-toe hay Battleship, hay đại loại thế. Đó là một khái niệm trừu tượng tuyệt vời, thay vì có để suy nghĩ về một Tic-tac-toe hội đồng quản trị như là một dòng chín vuông hoặc một ban hạm như là một dòng 100 ô vuông. A 10 10 lưới hoặc một ba bởi ba lưới có lẽ rất nhiều dễ dàng hơn để cảm nhận. Bây giờ, một cái gì đó thực sự quan trọng về mảng. Chúng ta có thể đối xử với mỗi cá nhân phần tử của mảng như là một biến. Chúng tôi thấy rằng trước đó khi chúng ta đã gán giá trị True để Booleans nhất định hoặc thử nghiệm chúng trong điều kiện. Nhưng chúng tôi không thể xử lý toàn bộ mảng tự như các biến. Chúng ta không thể, ví dụ, phân công một mảng đến một mảng bằng cách sử dụng giao điều hành. Đó là không hợp pháp C. Nếu chúng ta muốn, cho example-- gì chúng ta sẽ được làm trong ví dụ mà sẽ được sao chép vào một mảng khác. Nếu chúng ta muốn làm điều đó, chúng tôi thực sự cần phải sử dụng một vòng lặp để sao chép trên mỗi phần tử cá nhân cùng một lúc. Tôi biết đó là một ít tốn thời gian. Vì vậy, ví dụ, nếu chúng ta có những cặp vợ chồng của dòng mã, sẽ làm việc này? Vâng, không, nó sẽ không, phải không? Bởi vì chúng tôi đang cố gắng giao thức ăn đến quầy bar. Đó không phải đi làm việc, bởi vì nó là một mảng, và chúng tôi vừa mô tả rằng đó không phải là pháp luật C. Thay vào đó, nếu chúng ta muốn sao chép nội dung của thực phẩm vào bar, đó là những gì chúng tôi đang cố gắng để làm ở đây, chúng ta sẽ cần một cú pháp như thế này. Chúng tôi có một vòng lặp mà đi từ J là bằng 0 lên đến 5, và chúng tôi tăng J trên mỗi lần lặp của các vòng lặp và các yếu tố chỉ định như thế. Điều này sẽ cho kết quả thanh cũng là một, hai, ba, bốn, năm, nhưng chúng ta phải làm điều đó này rất chậm tố-by-yếu tố cách, thay vì chỉ bằng cách sao chép toàn bộ mảng. Trong lập trình khác ngôn ngữ, những người hiện đại hơn, bạn có thể, trong thực tế, làm chỉ mà đơn giản bằng cú pháp. Nhưng C, không may, chúng tôi không được phép làm điều đó. Bây giờ, có một khác điều tôi muốn đề cập đến về mảng đó có thể là một chút chút khôn lanh lần đầu tiên bạn làm việc với họ. Chúng tôi đã thảo luận trong một video về phạm vi biến, mà hầu hết các biến trong C, khi bạn gọi chúng trong các chức năng, được truyền theo giá trị. Bạn có nhớ những gì nó có nghĩa là để vượt qua một cái gì đó bằng giá trị? Nó có nghĩa là chúng tôi đang làm cho một bản sao của biến đó được truyền vào. Các chức năng callee, chức năng đó là nhận được sự thay đổi, không có biến đó. Nó bị riêng của địa phương bản sao của nó để làm việc với. Mảng, tất nhiên, làm không tuân theo quy tắc này. Thay vào đó, những gì chúng ta gọi đây đi ngang qua tham khảo. Callee thực không nhận được mảng. Nó không nhận nó bản sao cục bộ của riêng của nó. Và nếu bạn nghĩ về nó, điều này làm cho tinh thần. Nếu mảng là thực sự lớn, nó phải mất quá nhiều thời gian và công sức để tạo một bản sao của một mảng của 100 hay 1.000 hay 10.000 phần tử, rằng nó không phải là giá trị nó cho một chức năng để nhận được một bản sao của nó, làm một số công việc với nó, và sau đó chỉ được thực hiện với các bản sao; nó không cần phải có nó treo xung quanh nữa. Bởi vì mảng là một số cồng kềnh và nặng nề, chúng ta chỉ cần vượt qua chúng bằng cách tham khảo. Chúng tôi chỉ tin tưởng rằng chức năng để, không phá vỡ bất cứ điều gì. Vì vậy, nó thực sự có được mảng. Nó không nhận được bản sao riêng của địa phương của nó. Vậy điều này có nghĩa là, sau đó, khi các callee thao túng các phần tử của mảng? Điều gì sẽ xảy ra? Để bây giờ, chúng tôi sẽ đánh bóng hơn lý do tại sao chính xác này xảy ra, tại sao mảng được thông qua tham khảo và mọi thứ khác là tham trị. Nhưng tôi hứa với các bạn, chúng tôi sẽ trở lại và cung cấp cho bạn câu trả lời đến điều này trong một đoạn video sau. Dưới đây là một bài tập nhiều hơn cho bạn trước khi chúng tôi quấn lên những thứ trên mảng. Các bó mã ở đây, đó là không đặc biệt tốt phong cách, chỉ là tôi sẽ làm báo trước đó. Không có bình luận tại đây, đó là hình thức khá xấu. Nhưng đó chỉ là vì tôi muốn được thể phù hợp với tất cả mọi thứ trên màn hình. Ở phía trên, bạn có thể thấy rằng tôi có hai tờ khai chức năng cho mảng tập và thiết lập int. Set mảng rõ ràng phải mất một mảng bốn số nguyên như là đầu vào của nó. Và set int dường như mất một số nguyên duy nhất là đầu vào của nó. Nhưng cả hai đều không có một đầu ra. Các đầu ra, sự trở lại gõ, của mỗi người là vô hiệu. Trong chính, chúng ta có một vài dòng mã. Chúng ta khai báo một biến số nguyên được gọi là A và gán cho nó giá trị 10. Chúng ta khai báo một mảng của bốn số nguyên gọi là B và chỉ định các yếu tố 0, 1, 2, và 3, tương ứng. Sau đó, chúng tôi có một cuộc gọi để thiết lập int và một lời kêu gọi thiết lập mảng. Các định nghĩa của bộ mảng và tập hợp int là xuống dưới, ở phía dưới. Và như vậy, một lần nữa, tôi hỏi bạn câu hỏi. Những gì được in ra ở đây vào cuối của Main? Có một col bản in. Tôi in ra hai số nguyên. Tôi in ra các nội dung của A và các nội dung của khung vuông B 0. Tạm dừng video ở đây và hãy dành một phút. Bạn có thể tìm ra những gì này chức năng sẽ in ở cuối? Hy vọng rằng, nếu bạn gọi lại phân biệt giữa đi qua bởi giá trị và đi ngang qua tham khảo, đây Vấn đề không phải là quá khó khăn cho bạn. Và câu trả lời bạn sẽ đã tìm thấy là điều này. Nếu bạn không thực sự chắc chắn như tại sao đó là trường hợp, mất một giây, quay trở lại, xem lại những gì tôi đã được chỉ thảo luận về việc chuyển các mảng bằng cách tham khảo, so với đi qua biến khác theo giá trị, và hy vọng, nó sẽ làm cho ý nghĩa nhiều hơn một chút. Tôi Doug Lloyd, và điều này là CS50.