DAVID Malan: Xin chào, và chào đón trở lại CS50. Vì vậy, đây là kết thúc của tuần thứ tư. Chỉ cần một thông báo đầu tiên. Vì vậy, cái gọi là thứ năm thứ hai là sắp tới này Monday tới. Đây là cơ hội để thay đổi từ SAT / UNSAT một lớp thư, hoặc từ lớp thư SAT / UNSAT. Khó chịu, quá trình đó đòi hỏi một chữ ký, bởi vì bạn phải điền ra một trong những add / thả các hình thức màu hồng. Bởi vì về mặt kỹ thuật, SAT / UNSAT phiên bản và phiên bản cấp thư có số Danh mục riêng biệt. Nhưng không có việc lớn. Chỉ đến gặp tôi hoặc Rob hoặc Lauren tại bất kỳ điểm nào. Hoặc email cho chúng tôi nếu bạn không có các loại thủ tục giấy tờ bạn cần ngày hôm nay, và chúng tôi chắc chắn sẽ giúp bạn sóc đó trước thứ Hai. Được rồi, vì vậy hôm nay - trên thực tế, có một chút của một tiếng vang. Chúng tôi có thể giai điệu tôi xuống một chút? OK. Vì vậy, ngày hôm nay, chúng tôi giới thiệu một chủ đề được gọi là con trỏ. Và tôi sẽ thừa nhận rằng đây là một trong những chủ đề phức tạp hơn là chúng ta có xu hướng bao gồm trong nhóm này, hoặc thực sự bất kỳ khóa học giới thiệu sử dụng C. Nhưng dùng từ ngữ của tôi cho nó, đặc biệt nếu tâm trí của bạn cảm thấy một chút cong hôm nay và trong những tuần tới. Nó không phải là đại diện của bạn nhận được bất kỳ tồi tệ hơn lúc này nó chỉ có nghĩa là đó là một chủ đề đặc biệt phức tạp mà tôi hứa, một vài tuần do đó, sẽ có vẻ như tất cả các quá nổi bật đơn giản khi nhìn lại. Tôi vẫn còn nhớ đến ngày nay. Tôi đang ngồi trong Elliott Phòng ăn, ngồi bên cạnh TF tôi Nishat Mehta, là đối tượng cư trú của Elliott nhà. Và đối với một số lý do, điều này chủ đề chỉ nhấp chuột. Mà là để nói rằng tôi quá vất vả với nó cho một số lượng thời gian, nhưng tôi sẽ làm hết sức mình để tránh bất kỳ như vậy đấu tranh với một chủ đề mà cuối cùng là khá mạnh mẽ. Trong thực tế, một trong những chủ đề chúng ta sẽ thảo luận về trong những tuần tới là an ninh, và làm thế nào bạn có thể thực sự khai thác máy móc trong cách mà không được dự định. Và những người bóc lột thường là kết quả của lỗi, những sai lầm mà chúng ta người thực hiện bằng cách không hiểu biết một số việc thực hiện cơ bản chi tiết thông qua các chương trình được thực hiện. Bây giờ thực hiện điều này dường như tất cả người sử dụng hơn thân thiện, tôi nghĩ rằng tôi muốn chơi một 10 xem trước thứ hai của một claymation ít con số có tên là Binky người đã được đưa đến cuộc sống của một người bạn của chúng ta tại Đại học Stanford, Giáo sư Nick Parlante. Vì vậy, cho phép tôi để cung cấp cho bạn này teaser Binky đây. [VIDEO xem lại] -Này, Binky. Thức dậy. Đó là thời gian cho con trỏ vui vẻ. -Cái gì thế? Tìm hiểu về con trỏ? Oh, goodie. [END xem video] DAVID Malan: Đó là Stanford khoa học máy tính. Vì vậy, thêm vào đó đi. [Vỗ tay] DAVID Malan: Xin lỗi, Nick. Vì vậy, nhớ lại rằng thời gian qua, chúng tôi đã kết thúc cliffhanger thực sự thú vị này theo đó chức năng này chỉ không làm việc. Ít nhất là trực giác, nó cảm thấy như nó phải làm việc. Chỉ đơn giản là trao đổi các giá trị của hai số nguyên. Nhưng nhớ lại rằng khi chúng ta in ra giá trị ban đầu trong chính, một trong và hai, họ vẫn còn một và hai và không hai và một. Vì vậy, hãy để tôi thực sự chuyển đổi hơn vào thiết bị. Và tôi đã viết lên một chút mã xương trong trước đây, mà tôi cho rằng x sẽ được 1, y sẽ là 2. Sau đó tôi in ra cả hai họ giá trị với in f. Sau đó tôi yêu cầu bồi thường xuống đây mà chúng ta sẽ trao đổi chúng. Tôi để lại một chỗ trống ở đây để chúng tôi điền vào hôm nay chỉ trong một thời điểm. Sau đó, tôi sẽ cho rằng hai biến đã được đổi chỗ. Sau đó, tôi sẽ in họ trở lại. Và vì vậy hy vọng, tôi phải thấy được 1, 2. 2, 1. Đó là siêu đơn giản mục tiêu ngay bây giờ. Vì vậy, làm thế nào để chúng tôi đi về trao đổi hai biến? Vâng, nếu tôi đưa ra ở đây là các cốc có thể đại diện cho bộ nhớ trong máy tính. Đây là một vài miếng, điều này là một vài miếng. Có thể chúng ta có một tình nguyện đến trên và trộn chúng tôi một số đồ uống, nếu quen thuộc? Lên đây. Tên của bạn là gì? JESS: Jess. DAVID Malan: Jess? Lên đây, Jess. Nếu bạn không nhớ, chúng ta phải đặt Google Glass trên bạn vì vậy chúng tôi có thể bất tử này. OK, thủy tinh. Quay video. Và OK, chúng tôi là tốt để đi với Jess đây. Được rồi. Hân hạnh được gặp bạn. Vì vậy, những gì tôi muốn bạn làm ở đây - nếu bạn có thể, khá nhanh chóng - chỉ đổ cho chúng tôi một nửa ly nước cam nước trái cây và một nửa ly sữa, đại diện có hiệu quả số 1 trong một ly và 2 trong cốc khác. Điều này là có được cảnh quay tốt. JESS: Xin lỗi. DAVID Malan: Không, không. Đó là OK. Tốt đẹp. Được rồi, vì vậy chúng tôi có bốn byte giá trị của nước cam. Chúng tôi sẽ gọi nó là giá trị 1. Bây giờ thêm bốn byte giá trị của sữa. Sẽ gọi nó là giá trị 2. Vì vậy, x và y tương ứng. Được rồi, vì vậy bây giờ nếu công việc ở bàn tay - cho bạn, Jess, trước mặt tất cả các bạn cùng lớp của bạn - là để trao đổi các giá trị của x và y như vậy mà chúng tôi muốn các nước cam trong cốc khác và sữa trong chén này, làm thế nào có thể giúp bạn - trước khi bạn thực sự làm nó - đi về việc này? OK, khôn ngoan quyết định. Vì vậy, bạn cần nhiều bộ nhớ hơn một chút. Vì vậy, chúng ta hãy tạm thời phân bổ một tách, nếu bạn sẽ. Và bây giờ tiến hành trao đổi x và y. Tuyệt vời. Vì vậy, thực hiện rất tốt. Cảm ơn bạn rất nhiều, Jess. Của bạn đây. Một món quà lưu niệm nhỏ. OK, vì vậy rõ ràng, ý tưởng siêu đơn giản. Hoàn toàn trực quan mà chúng ta cần một chút không gian lưu trữ nhiều hơn - trong hình thức này, một tách - nếu chúng ta thực sự muốn trao đổi hai biến. Vì vậy, chúng ta hãy làm chính xác điều đó. Lên đây ở giữa nơi tôi yêu cầu tôi sẽ được làm một số trao đổi, tôi sẽ đi trước và tuyên bố tạm thời. Và tôi sẽ thiết lập nó bằng, nói, x. Sau đó, tôi sẽ thay đổi giá trị của x giống như Jess đã làm ở đây với sữa và nước cam được bằng y. Và tôi sẽ thay đổi y để được bình đẳng để không x, bởi vì bây giờ chúng tôi sẽ bị mắc kẹt trong một vòng tròn, mà là tạm thời. Nơi tôi tạm thời - hoặc nơi Jess tạm thời đặt các nước cam trước khi clobbering mà cốc với sữa. Vì vậy, hãy để tôi đi trước bây giờ và làm cho điều này. Nó được gọi là noswap.c. Và bây giờ cho phép tôi chạy không trao đổi. Và thực sự tôi thấy, nếu tôi mở rộng cửa sổ một chút, mà x 1, y là 2. Và sau đó là 2 x, y là 1. Nhưng nhớ lại rằng vào thứ hai, chúng tôi đã làm những điều một chút khác nhau trong đó tôi thay vì thực hiện một chức năng trợ giúp, nếu bạn muốn, đó là thực sự hiệu. Tôi gọi nó là trao đổi. Tôi đưa cho nó hai tham số, và tôi được gọi là họ và tôi gọi chúng là b. Thành thật mà nói, tôi có thể gọi họ là x và y. Có gì ngăn cản là tôi từ làm điều đó. Nhưng tôi sẽ cho nó sau đó một chút mơ hồ. Bởi vì thu hồi cho hôm thứ Hai rằng chúng tôi tuyên bố rằng những thông số này các bản sao của các giá trị thông qua nhập Vì vậy, nó chỉ messes với bạn tâm trí, tôi nghĩ rằng, nếu bạn sử dụng chính xác các biến tương tự. Vì vậy, tôi thay vì sẽ gọi cho họ một và b, chỉ cần cho rõ ràng. Nhưng chúng ta có thể gọi họ là nhất bất cứ điều gì chúng ta muốn. Và tôi sẽ sao chép và dán hiệu quả mã này từ trên đó xuống đây. Bởi vì tôi chỉ thấy rằng nó hoạt động. Vì vậy, đó là trong hình dạng khá tốt. Và tôi sẽ thay đổi của tôi x một, tôi x một, y của tôi để b và y của tôi để b. Vì vậy, nói cách khác, cùng một logic chính xác. Cùng một điều chính xác mà Jess đã làm. Và sau đó là một điều tôi phải làm lên ở đây, tất nhiên, bây giờ gọi này chức năng, hoặc gọi chức năng này. Vì vậy, tôi sẽ gọi hàm này với hai đầu vào, x và y, và nhấn Save. Được rồi, vì vậy về cơ bản điều tương tự. Trong thực tế, tôi đã có thể thực hiện chương trình phức tạp không cần thiết bởi viết một chức năng đó chỉ dùng một số sáu dòng mã trong khi tôi trước đó đã thực hiện trong này chỉ ba. Vì vậy, hãy để tôi đi trước bây giờ và làm lại này, làm cho không có trao đổi. Được rồi, tôi hơi say lên đây. Điều này sẽ là một lỗi mà bạn có thể thấy ngày càng phổ biến như của bạn chương trình trở nên phức tạp hơn. Nhưng có một sửa chữa dễ dàng. Hãy để tôi di chuyển trở lại lên đây. Và các lỗi đầu tiên tôi nhìn thấy là những gì? Khai tiềm ẩn. Điều đó thường như thế nào? Oh, tôi quên mất nguyên mẫu. Tôi quên để dạy các trình biên dịch hoán đổi sẽ tồn tại mặc dù anh không tồn tại ngay từ đầu của chương trình. Vì vậy, tôi chỉ muốn nói có hiệu lực, trao đổi, int, int a, b, dấu chấm phẩy. Vì vậy, tôi sẽ không để reimplement nó. Nhưng bây giờ nó phù hợp với những gì ở đây. Và thông báo, trường hợp không có một dấu chấm phẩy ở đây, đó là không cần thiết khi triển khai thực hiện. Vì vậy, hãy để tôi làm lại điều này, chắc không trao đổi. Hình dạng tốt hơn nhiều. Chạy không trao đổi. Và chết tiệt. Bây giờ chúng tôi đang trở lại nơi chúng tôi vào thứ hai, nơi điều không trao đổi. Và giải thích trực quan là những gì cho lý do tại sao đây là trường hợp? Yeah? HỌC SINH: [nghe được]. DAVID Malan: Chính xác. Vì vậy, a và b là bản sao của x và y. Và trong thực tế, bất cứ lúc nào bạn đã được gọi một hàm vậy, đến nay chuyển biến như ints - cũng như trao đổi được mong đợi ở đây - các bạn đã từng trải qua trong bản. Bây giờ có nghĩa là phải mất một chút thời gian, một tách thứ hai, cho máy tính để sao chép các bit từ một biến thành các bit của người khác. Nhưng đó không phải là một việc lớn như vậy. Nhưng họ dù sao một bản sao. Và vì vậy bây giờ, trong bối cảnh trao đổi, Tôi đang ở trong thực tế thành công thay đổi a và b. Trong thực tế, chúng ta hãy làm một cách nhanh chóng kiểm tra sanity. In f một là% i, dòng mới. Và chúng ta hãy cắm vào một. Bây giờ chúng ta hãy làm điều tương tự với b. Và chúng ta hãy làm điều tương tự ở đây. Và bây giờ, hãy để tôi sao chép các đường cùng một lần nữa ở dưới cùng của các chức năng sau ba dòng của tôi thú vị có thể thực hiện, và in a và b một lần nữa. Vì vậy, bây giờ chúng ta hãy làm điều này, chắc không trao đổi. Hãy để tôi làm cho cửa sổ thiết bị đầu cuối bit cao hơn, để chúng ta có thể nhìn thấy hơn của nó cùng một lúc. Và chạy không trao đổi. x 1, y là 2. a là 1, b là 2. Và sau đó, một là 2, b là 1. Vì vậy, nó làm việc, giống như Jess đã làm ở đây trong trao đổi. Nhưng tất nhiên, nó không có hiệu lực trên các biến trong chính. Vì vậy, chúng ta đã thấy một thủ thuật nhờ đó chúng ta có thể khắc phục điều này, phải không? Khi bạn đang phải đối mặt với Phạm vi này vấn đề, bạn chỉ có thể punt và làm cho x và y những loại biến để thay thế? Bạn có thể làm cho họ toàn cầu. Đặt chúng ở trên cùng của tập tin như chúng ta đã làm, ngay cả trong các trò chơi của 15. Chúng tôi sử dụng một biến toàn cầu. Nhưng trong bối cảnh của trò chơi một 15, đó là hợp lý để có một toàn cầu biến đại diện cho hội đồng quản trị, bởi vì toàn bộ 15.c là tất cả về việc thực hiện trò chơi đó. Đó là những gì các tập tin tồn tại để làm. Nhưng trong trường hợp này đây, tôi gọi một hoán đổi chức năng. Tôi muốn trao đổi hai biến. Và nó sẽ bắt đầu cảm thấy chỉ cẩu thả nếu giải pháp cho tất cả chúng tôi vấn đề khi chúng tôi chạy vào phạm vi vấn đề là làm cho nó toàn cầu. Bởi vì rất nhanh chóng chương trình của chúng tôi là sẽ trở nên khá lộn xộn. Và chúng tôi đã làm điều đó rất ít kết quả là trong 15.c. Nhưng hóa ra có một cách tốt hơn hoàn toàn. Hãy để tôi thực sự quay trở lại và xóa in f, chỉ để đơn giản hóa mã này. Và cho tôi đề nghị này, thực sự, là xấu. Nhưng nếu tôi thay vì thêm vào một số dấu sao và các ngôi sao, tôi thay vì có thể biến điều này chức năng vào một trong đó là thực sự hoạt động. Vì vậy, hãy để tôi quay trở lại đây và thừa nhận rằng dấu hoa thị luôn luôn là khó khăn, vì vậy tôi sẽ nói sao. Tôi sẽ chỉ fess lên với một. Được rồi. Và bây giờ, những gì tôi sẽ làm thay vào đó? Vì vậy, trước hết, tôi sẽ chỉ định thay vì đi qua một int vào chức năng trao đổi, tôi thay vì đi nói int sao. Bây giờ, những gì các ngôi sao như thế nào? Đây là khái niệm về một con trỏ Binky, nhân vật claymation, là đề cập đến một thời điểm trước đây. Vì vậy, nếu chúng ta nói int sao, ý nghĩa của này bây giờ là một sẽ không được thông qua tại bởi giá trị của nó. Nó sẽ không được sao chép in Thay vào đó, địa chỉ của một là sẽ được thông qua nhập Vì vậy, nhớ lại rằng bên trong máy tính của bạn là một bó toàn bộ bộ nhớ, nếu không được gọi là bộ nhớ RAM. Và bộ nhớ RAM mà chỉ một là bó toàn bộ các byte. Vì vậy, nếu máy Mac của bạn hoặc máy tính của bạn có hai gigabyte, bạn có 2 tỷ byte của bộ nhớ. Bây giờ chúng ta hãy giả sử rằng chỉ để giữ cho mọi thứ tốt đẹp và có trật tự, chúng tôi gán địa chỉ - một số - đến từng byte bộ nhớ RAM trong máy tính của bạn. Các byte đầu tiên của những người 2 tỷ là do số không. Tiếp theo là một byte số một, số hai, tất cả các cách trên lên, chấm chấm dấu chấm, để khoảng 2 tỷ USD. Vì vậy, bạn có thể số lượng các byte bộ nhớ trong máy tính của bạn. Vì vậy, chúng ta hãy giả sử rằng đó là những gì chúng tôi có nghĩa là một địa chỉ. Vì vậy, khi tôi nhìn thấy int một ngôi sao, những gì đang xảy ra được chuyển vào trao đổi bây giờ là địa chỉ của một. Không giá trị của nó, nhưng bất cứ điều gì bưu chính của nó địa chỉ, do đó, để nói chuyện - vị trí của nó trong bộ nhớ RAM. Và tương tự cho b, tôi sẽ để nói điều tương tự. Int, ngôi sao, b. Như một sang một bên, về mặt kỹ thuật các ngôi sao có thể đi trong các địa điểm khác. Nhưng chúng tôi sẽ chuẩn hóa trên các ngôi sao được ngay bên cạnh các kiểu dữ liệu. Vì vậy, trao đổi chữ ký bây giờ có nghĩa là, cho tôi địa chỉ của một int, và cuộc gọi địa chỉ một. Và đưa cho tôi một địa chỉ của một int và gọi đó là địa chỉ b. Nhưng bây giờ mã của tôi ở đây đã thay đổi. Bởi vì nếu tôi khai báo int tạm thời - mà vẫn còn kiểu int - nhưng tôi lưu trữ trong nó một, loại có giá trị? Để được rõ ràng, tôi đặt một một với các mã như được viết ngay bây giờ? Tôi đang đặt vị trí trong một. Nhưng tôi không quan tâm về vị trí bây giờ, phải không? Nhiệt độ chỉ tồn tại Jess 'chén thứ ba tồn tại, cho mục đích gì? Để lưu trữ một giá trị. Sữa hoặc nước cam. Không thực sự lưu trữ địa chỉ của một trong những điều đó, mà cảm thấy một ít vô nghĩa trong này thực bối cảnh thế giới nào. Vì vậy, thực sự, những gì tôi muốn đặt ở nhiệt độ không phải là địa chỉ của một, nhưng các nội dung của một. Vì vậy, nếu một là một con số như 123, đây là 123 byte của bộ nhớ mà một chỉ sẽ xảy ra là chiếm đóng, rằng giá trị trong một sẽ xảy ra là chiếm đóng. Nếu tôi muốn đi đến địa chỉ đó, Tôi cần phải nói một ngôi sao. Tương tự như vậy, nếu tôi có thể thay đổi những gì tại địa chỉ một, tôi thay đổi này để bắt đầu một. Nếu tôi muốn lưu trữ trong những gì ở vị trí một với những gì ở vị trí tại b, b sao sao. Vì vậy, trong ngắn hạn, thậm chí nếu điều này là không hoàn toàn chìm trong nhưng - và tôi sẽ không mong đợi rằng nó sẽ rất nhanh - nhận ra rằng tất cả tôi đang làm là tiền tố những ngôi sao để biến của tôi, nói không lấy các giá trị. Không làm thay đổi giá trị. Nhưng đúng hơn, đi đến những địa chỉ và có được giá trị. Đi đến địa chỉ và thay đổi giá trị đó. Vì vậy, bây giờ hãy để tôi di chuyển trở lại lên đến đỉnh, chỉ để sửa chữa đường dây này đây, để thay đổi mẫu cho phù hợp. Nhưng bây giờ tôi cần phải làm một việc khác. Trực giác, nếu tôi đã thay đổi các loại các đối số trao đổi được mong đợi, những gì khác tôi cần phải thay đổi trong mã của tôi? Khi tôi gọi điện trao đổi. Bởi vì ngay bây giờ, những gì am Tôi đi qua để trao đổi vẫn còn? Giá trị x và các giá trị của y, hoặc sữa và nước cam. Nhưng tôi không muốn làm điều đó. Tôi thay vì muốn vượt qua trong những gì? Vị trí của x và vị trí của y. Địa chỉ bưu chính của họ là gì, vậy để nói chuyện. Vì vậy, để làm được điều đó, có một ký hiệu. Loại ký hiệu của âm thanh như địa chỉ. như vậy n, ký hiệu, địa chỉ của x, và địa chỉ của y. Vì vậy, nó cố ý mà chúng tôi sử dụng ampersands khi gọi chức năng, và các ngôi sao khi khai báo và khi thực hiện chức năng. Và chỉ cần nghĩ về ký hiệu là địa chỉ của nhà điều hành, và ngôi sao như các đến đó điều hành - hoặc, đúng hơn, toán tử tham chiếu. Vì vậy, đó là một toàn bộ rất nhiều lời chỉ để nói rằng bây giờ, hy vọng, trao đổi đang diễn ra được chính xác. Hãy để tôi đi trước và thực hiện - chúng ta hãy thực sự đổi tên tập tin, vì sợ chương trình này vẫn được gọi là không có trao đổi. Tôi cho rằng chúng ta sẽ gọi nó là swap.c bây giờ. Vì vậy, làm cho, trao đổi. Dấu chấm, dấu gạch chéo, trao đổi. Và bây giờ thực sự, x 1, y là 2. Và sau đó, x là 2, y là một. Vâng chúng ta hãy xem nếu chúng ta không thể làm điều này một chút khác nhau như những gì xảy ra ở đây. Đầu tiên, hãy để tôi phóng to trên của chúng tôi vẽ màn hình ở đây. Và cho tôi đề nghị cho một thời điểm - và bất cứ khi nào tôi rút ra ở đây sẽ được nhân đôi lên hiện nay - cho tôi đề nghị đây là một bó toàn bộ bộ nhớ, hoặc RAM, bên trong máy tính của tôi. Và đây sẽ là số cắn, hãy nói, 1. Đây sẽ là byte số 2. Và tôi sẽ làm một bó toàn bộ hơn, và sau đó một loạt các dấu chấm dấu chấm dấu chấm để chỉ ra rằng có 2 tỷ những điều này. 4, 5, và vv. Như vậy, có là năm byte đầu tiên bộ nhớ máy tính của tôi. Tất cả phải không? Rất ít ra khỏi 2 tỷ USD. Nhưng bây giờ tôi sẽ đề xuất sau. Tôi sẽ đề nghị x sẽ lưu trữ số 1, và y sẽ để lưu trữ các số 2. Và để cho tôi đi trước bây giờ và đại diện các giá trị như sau. Chúng ta hãy làm điều này như sau. Cho tôi chỉ một giây. Thứ hai. OK. Tôi muốn làm điều này một chút - chúng ta hãy làm điều này một lần nữa. Không thì tôi sẽ để và sử dụng con số tương tự, vô tình, nhiều lần. Vì vậy, chỉ vì vậy chúng tôi có số lượng khác nhau để nói về, chúng ta hãy gọi byte này số 123, 124, 125, 126, và dấu chấm chấm chấm. Và hãy để tôi khẳng định bây giờ mà tôi sẽ đặt giá trị 1 ở đây, và giá trị 2 ở đây, hay còn gọi là x và y. Vì vậy, nó chỉ như vậy sẽ xảy ra rằng đây là x, đây là y. Và chỉ bằng một số cơ hội ngẫu nhiên, máy tính, hệ điều hành, đã xảy ra tại địa điểm đặt x số 123. Và y đã kết thúc ở vị trí 124 - chết tiệt. Tôi có nên cố định này. Ôi trời, tôi thực sự muốn làm điều này? Có, tôi muốn để sửa lỗi này và b thích về điều này hôm nay. Xin lỗi, mới lúc này. 127, 131, và tôi không muốn làm được điều này phức tạp, nhưng tại sao tôi thay đổi con số đó? Bởi vì tôi muốn các số nguyên để thực sự là bốn byte. Vì vậy, hãy là siêu hậu môn về việc này. Vì vậy, nếu 1 xảy ra để được giải quyết 123, 2 là có được tại địa chỉ 127 bởi vì nó chỉ là 4 lời tạm biệt đi. Đó là tất cả. Và chúng tôi sẽ quên đi tất cả các địa chỉ khác trên thế giới. Vì vậy, x là ở vị trí 123, y là ở vị trí 127. Và bây giờ, những gì tôi làm thực sự muốn làm gì? Khi tôi gọi điện trao đổi bây giờ, những gì thực sự xảy ra? Vâng, khi tôi gọi điện trao đổi, tôi đang đi qua trong địa chỉ của x và địa chỉ của y. Vì vậy, ví dụ, nếu hai phần giấy bây giờ đại diện cho hai đối số a, b để trao đổi, tôi là gì sẽ viết vào ngày đầu tiên trong số này, mà tôi sẽ gọi đề cập đến như một? Chính xác, 123. Vì vậy, điều này tôi khẳng định là một. Đây là một tham số. Tôi đang đặt địa chỉ của x trong đó. Đó là những gì? Đó là những gì? Không, không. Đó là OK. Vẫn tốt, vẫn còn tốt. Vì vậy, đây là một. Và bây giờ, phần thứ hai của bài báo, này là có được b, và những gì tôi sẽ được viết trên mảnh giấy này? 127. Vì vậy, điều duy nhất đó là thay đổi kể từ đang chu trước đây về câu chuyện này là, chứ không phải theo nghĩa đen 1 và 2, tôi sẽ vượt qua trong 123 và 127. Và bây giờ tôi sẽ đưa các bên trong của ô này, tất cả phải không? Vì vậy mà hộp đen hiện chiếm chức năng trao đổi. Trong khi đó, bây giờ chúng ta có một người nào đó thực hiện chức năng trao đổi. Sẽ có người lên đây muốn tình nguyện? Lên đây. Tên của bạn là gì? Charlie. Được rồi, Charlie. Lên đây. Vì vậy, Charlie sẽ chơi vai trò của hộp đen của chúng tôi. Và Charlie, những gì tôi muốn bạn làm bây giờ là thực hiện trao đổi theo cách như vậy rằng, với hai địa chỉ, bạn đã thực sự đi để thay đổi các giá trị. Và tôi sẽ thì thầm vào tai của bạn làm thế nào để chạy TV đây. Nên đi trước, và bạn là hộp đen. Đạt được trong đó. Những giá trị làm bạn thấy một, và những giá trị làm bạn thấy cho b? CHARLIE: một là 123 và b là 127. DAVID Malan: OK, chính xác. Bây giờ tạm dừng ở đó chỉ là một thời điểm. Điều đầu tiên bạn sẽ làm gì bây giờ, theo mã - mà Bây giờ tôi sẽ kéo lên trên màn hình - là có được phân bổ một chút bit của bộ nhớ được gọi là tạm thời. Vì vậy, tôi sẽ đi trước và cung cấp cho bạn bộ nhớ. Vì vậy, đây sẽ là một biến thứ ba mà bạn có thể truy cập vào bạn được gọi là tạm thời. Và những gì thì bạn sẽ viết trên mảnh giấy tạm thời? CHARLIE: Con trỏ, phải không? DAVID Malan: OK, cũng không nhất thiết phải là con trỏ. Vì vậy, các dòng mã mà tôi đã nhấn mạnh ở phía bên tay phải, chúng ta hãy bắt đầu từ đó. Nó nói một ngôi sao. Vì vậy, một hiện đang lưu trữ số 123. Và chỉ bằng trực giác, những gì đã sao 123 nghĩa là gì? Nhưng đặc biệt, nếu là 123, một ngôi sao có nghĩa là gì? Giá trị của một. Hoặc tình cờ hơn, đến đó. Vì vậy, hãy để tôi đề xuất rằng, giữ một trong bàn tay của bạn, đi trước và điều trị bệnh này như thể đó là một bản đồ. Và đi bộ một mình qua của máy tính bộ nhớ, và tìm thấy chúng tôi là những gì ở vị trí 123. Chính xác. Vì vậy, chúng ta thấy ở vị trí 123 là những gì, rõ ràng? OK, vì vậy những gì giá trị bây giờ là bạn sẽ đưa vào tạm thời? Chính xác. Vì vậy, đi trước và làm điều đó. Và viết số 1 trên mảnh giấy hiện đang có tựa đề tạm thời. Và bây giờ là bước tiếp theo bạn sẽ thực hiện là có được những gì. Vâng, ở phía bên tay phải của dòng tiếp theo của mã là sao b. b, của Tất nhiên, các cửa hàng một địa chỉ. Có địa chỉ 127. Sao b có nghĩa là gì, tình cờ nói? Đi đến địa điểm đó. Vì vậy, đi trước và tìm thấy chúng tôi những gì ở vị trí 127. OK. Tất nhiên, ở vị trí 127, vẫn là giá trị 2. Vì vậy, những gì đang xảy ra tại cửa hàng tại bất cứ điều gì ở các vị trí trong một? Vì vậy, ngôi sao một phương tiện đi đến vị trí một. Vị trí một là những gì? Chính xác. Vì vậy, bây giờ, nếu bạn muốn thay đổi những gì tại địa điểm đó - Tôi sẽ đi trước và chạy tẩy đang ở đây. Và bây giờ đặt nó trở lại trên bàn chải. Số những gì bạn sẽ viết trong đó ô trống bây giờ? Chính xác. Vì vậy, dòng mã này, đã rõ ràng - cho tôi dừng lại những gì của Charlie làm và chỉ ra ở đây, những gì ông vừa làm viết vào hộp đó ở vị trí 123 giá trị mà trước đây tại b. Và vì vậy chúng tôi đã thực hiện tại thực sự dòng thứ hai của mã. Bây giờ không may, có vẫn còn một dòng còn lại. Bây giờ những gì là ở nhiệt độ, theo nghĩa đen? Đó rõ ràng là số một. Đó không phải là một địa chỉ. Nó chỉ là một số, loại một biến từ một tuần. Và bây giờ khi bạn nói sao b, điều đó có nghĩa đi đến địa chỉ b, là của Tất nhiên ở đây. Vì vậy, khi bạn đến nơi - Tôi sẽ đi trước và xóa những gì thực sự có - và những gì bạn sẽ viết tại 127 vị trí? CHARLIE: Nhiệt độ, đó là một trong. DAVID Malan: Nhiệt độ, đó là một trong. Và những gì xảy ra với nhiệt độ cuối cùng? Vâng, chúng tôi thực sự không biết. Chúng tôi không thực sự quan tâm. Bất cứ lúc nào chúng tôi đã thực hiện một chức năng cho đến nay, bất kỳ biến địa phương mà bạn có thực sự là địa phương. Và họ chỉ biến mất. Họ khai hoang bởi điều hành hệ thống cuối cùng. Vì vậy, thực tế là tạm thời vẫn có giá trị 1 là loại cơ bản không thú vị cho chúng tôi. Được rồi, do đó, một tràng pháo tay nếu chúng ta có thể cho Charlie. Thực hiện rất tốt. Được rồi, vì vậy những gì hơn không điều này có nghĩa là chúng ta có thể làm gì? Vì vậy, nó chỉ ra rằng chúng tôi đã nói một vài lời nói dối trong một thời gian. Trên thực tế, nó chỉ ra rằng một chuỗi, tất cả thời gian này, không phải là thực sự là một chuỗi ký tự cho mỗi gia nhập. Nó loại là trực giác. Nhưng nói về mặt kỹ thuật, chuỗi là một kiểu dữ liệu mà chúng ta tuyên bố bên trong thư viện CS50 để đơn giản hóa thế giới trong vài tuần đầu tiên của lớp. Địa chỉ là một chuỗi thực sự là của một nhân vật ở đâu đó trong bộ nhớ RAM. Một chuỗi thực sự là một con số, như 123 hoặc 127, điều đó xảy ra để phân ranh giới nơi một chuỗi bắt đầu trong bộ nhớ máy tính của bạn. Nhưng nó không đại diện cho chuỗi, cho mỗi gia nhập, chính nó. Và chúng ta có thể thấy điều này như sau. Hãy để tôi đi trước và mở ra một số mã đó là trong ví dụ mã nguồn của ngày hôm nay. Và tôi sẽ đi trước và mở lên, chúng ta hãy nói, so sánh-0.c. Đây là một chương trình lỗi có nghĩa là sẽ được thực hiện như sau. Đầu tiên. Tôi sẽ nói điều gì đó. Sau đó tôi sẽ đi trước và nhận được một chuỗi từ người sử dụng trong đó dòng tiếp theo. Sau đó, tôi sẽ nói lại lần nữa. Sau đó, tôi sẽ nhận được một chuỗi từ người sử dụng. Và thông báo, tôi thấy một trong những chuỗi trong một biến gọi là, và khác của các chuỗi trong một biến gọi là t. Và bây giờ tôi sẽ yêu cầu bồi thường, rất hợp lý, rằng nếu s tương đương với bằng t, các chuỗi đều giống nhau. Bạn gõ cùng một điều. Khác, các chuỗi là không phải là điều tương tự. Sau khi tất cả, nếu chúng ta đầu vào hai số nguyên, hai ký tự, hai phao, hai đôi, bất kỳ các kiểu dữ liệu, chúng tôi đã nói chuyện về cho đến nay để so sánh chúng - nhớ lại chúng ta thực hiện rất rõ ràng trong khi trước đây mà bạn không làm được điều này, bởi vì một dấu bằng là các khóa học các nhà điều hành chuyển nhượng. Vì vậy, đó sẽ là một lỗi. Chúng tôi sử dụng dấu bằng bằng, mà thực sự so sánh thứ cho thật sự bình đẳng. Nhưng tôi khẳng định đây là lỗi. Nếu tôi đi trước và thực hiện so sánh không, và sau đó làm dấu chấm dấu gạch chéo so sánh không. Và tôi gõ vào, chúng ta hãy nói, xin chào. Và sau đó chúng ta hãy nói lời chào một lần nữa. Nghĩa là điều tương tự, máy tính tuyên bố tôi gõ những thứ khác nhau. Bây giờ có lẽ tôi chỉ gõ sai một cái gì đó. Tôi sẽ gõ tên của tôi thời gian này. Ý tôi là, xin chào. Xin chào. Nó khác nhau mỗi lần duy nhất. Vâng, tại sao vậy? Thực sự là những gì xảy ra bên dưới mui xe? Vâng, những gì đang thực sự xảy ra bên dưới mui xe là một chuỗi sau đó Tôi gõ vào đó lần đầu tiên ví dụ là lời chào, tất nhiên. Nhưng nếu chúng tôi đại diện này bên dưới mui xe, nhớ lại rằng một chuỗi trong một mảng. Và chúng tôi đã nói như vậy trong quá khứ. Vì vậy, nếu tôi vẽ mảng như thế này, tôi sẽ đại diện cho một cái gì đó khá tương tự như những gì chúng tôi đã làm một thời điểm trước đây. Và có thực sự là một cái gì đó đặc biệt ở đây, quá. Chúng tôi đã xác định được tại cuối mỗi chuỗi? Yeah, dấu gạch chéo ngược này không, đó là chỉ cách đại diện, nghĩa đen, 00000000. Tám bit 0 liên tiếp. Tôi không biết, thẳng thắn, những gì sau này. Đó chỉ là một bó hơn RAM bên trong máy tính của tôi. Nhưng đây là một mảng. Chúng tôi nói về mảng trước. Và chúng tôi thường nói về mảng như là vị trí không, sau đó, sau đó hai. Nhưng đó chỉ là để thuận tiện. Và đó là hoàn toàn tương đối. Khi bạn thực sự nhận được từ bộ nhớ máy tính, đó là tất nhiên bất cứ 2 tỷ một số byte lẻ, có khả năng. Vì vậy, thực sự bên dưới mui xe, tất cả thời gian này, có. Điều này rất có thể là khung không. Nhưng nếu bạn đào sâu hơn bên dưới mui xe, đó là thực sự địa chỉ số 123. Đây là địa chỉ 124. Đây là địa chỉ 125. Và tôi đã không vít lên thời gian này. Giờ đây là một byte ngoài vì lý do gì? Làm thế nào lớn là một char? Một char chỉ là một byte. Một int thường là bốn byte. Vì vậy, đó là lý do tại sao tôi đã làm cho nó 123, 127, 131 và vv. Bây giờ tôi có thể giữ cho toán học đơn giản và chỉ cần làm thêm 1. Và đây là bây giờ những gì thực sự xảy ra trên dưới mui xe. Vì vậy, khi bạn khai báo một cái gì đó như thế này, string s, điều này thực sự - nó quay ra - char sao. Ngôi sao, tất nhiên, có nghĩa là địa chỉ, hay còn gọi là con trỏ. Vì vậy, nó là địa chỉ của một cái gì đó. Đó là những gì địa chỉ của? Cũng - Tôi là người duy nhất có thể nhìn thấy rất điểm quan trọng mà tôi đang làm, hoặc nghĩ Tôi đang thực hiện. Vì vậy, chuỗi - điều đáng buồn là tôi có một màn hình ngay nơi tôi có thể thấy rằng. Được rồi, vì vậy chuỗi s là những gì Tôi tuyên bố trước đó. Nhưng hóa ra, nhờ một chút ma thuật trong thư viện CS50, tất cả điều này Hiện chuỗi có nghĩa được char sao. Các ngôi sao lại có nghĩa con trỏ hoặc địa chỉ. Thực tế là nó chầu từ char có nghĩa là đó là địa chỉ của một nhân vật. Vì vậy, nếu có được chuỗi được gọi, và tôi gõ trong H-E-L-L-O, đề nghị bây giờ những gì đã có được chuỗi đúng là đã được trả lại tất cả các thời gian này, mặc dù chúng tôi đã thay giản trên thế giới? Những gì không có được chuỗi thực sự trở lại như giá trị trả về của nó? 123 trong trường hợp này, ví dụ. Trước đó chúng tôi đã nói rằng nhận được chuỗi chỉ đơn giản là trả về một chuỗi, một chuỗi các ký tự. Nhưng đó là một chút của một lời nói dối. Cách nhận được chuỗi thực sự làm việc bên dưới mui xe là nó được một chuỗi từ người sử dụng. Nó plops các ký tự họ loại trong bộ nhớ. Nó đặt một dấu gạch chéo ngược không ở cuối của những chuỗi ký tự. Nhưng sau đó những gì không có được chuỗi nghĩa đen trở lại? Nó nghĩa là trả về địa chỉ của byte đầu tiên trong bộ nhớ RAM mà nó được sử dụng cho sức mạnh đó. Và nó chỉ ra rằng chỉ bằng cách trả lại một địa chỉ duy nhất của ký tự đầu tiên trong chuỗi, đó là đủ cho việc tìm kiếm toàn bộ chuỗi. Nói cách khác, nhận được chuỗi không có trở lại 123 và 124 và 125. Nó không có để cung cấp cho tôi một dài danh sách của tất cả các byte chuỗi của tôi đang sử dụng. Bởi vì một, tất cả đều trở lại trở lại. Và hai, dựa trên địa chỉ đầu tiên, tôi có thể tìm ra nơi kết thúc chuỗi. Làm thế nào? Các ký tự null đặc biệt, dấu gạch chéo ngược không ở cuối. Vì vậy, nói cách khác, nếu bạn chuyển - bên trong của các biến - địa chỉ của một char, và bạn giả mà tại kết thúc một chuỗi, bất kỳ chuỗi các ký tự như con người chúng ta suy nghĩ những chuỗi, nếu bạn cho rằng tại kết thúc một chuỗi như vậy có một số không dấu chéo ngược, bạn vàng. Bởi vì bạn luôn luôn có thể tìm thấy kết thúc của một chuỗi. Bây giờ những gì đang thực sự sau đó đi trên trong chương trình này? Tại sao chương trình này, so sánh-0.c, lỗi? Những gì thực sự đang được so sánh? Yeah? HỌC SINH: [nghe được]. DAVID Malan: Chính xác. Nó so sánh các địa điểm của các chuỗi. Vì vậy, nếu người dùng đã gõ trong chào một lần, như tôi đã làm, bộ nhớ có thể kết thúc tìm kiếm như thế này. Nếu người dùng sau đó loại trong chào một lần nữa, nhưng bằng cách gọi nhận được chuỗi một lần nữa, c là không đặc biệt thông minh, trừ khi bạn dạy nó sẽ được thông minh bằng cách viết mã. C - và các máy tính nói chung - nếu bạn gõ vào từ hello một lần nữa, bạn biết những gì bạn sẽ nhận được. Bạn chỉ cần đi để có được một mảng thứ hai bộ nhớ, có, xảy ra, hãy lưu trữ H-E-L-L-O và vv. Nó sẽ giống nhau để con người chúng ta, nhưng địa chỉ này có thể không được 123. Nó chỉ có thể để xảy ra rằng hệ điều hành có một số có sẵn không gian ví dụ tại địa điểm - chúng ta hãy nói điều gì đó tùy ý, như thế này là vị trí 200. Và đây là vị trí 201. Và đây là vị trí 202. Chúng tôi không có ý tưởng đó là sẽ có trong bộ nhớ. Nhưng điều này có nghĩa là đó là những gì sẽ được lưu trữ cuối cùng trong s? Số 123. Những gì sẽ được lưu trữ trong t, trong ví dụ tùy ý này? Số 200. Và tất cả những gì có nghĩa là sau đó rõ ràng là, 123 không bằng 200. Và vì vậy điều này nếu điều kiện không bao giờ đánh giá đúng sự thật. Vì get chuỗi được sử dụng khác nhau khối bộ nhớ mỗi lần. Bây giờ chúng ta có thể thấy điều này một lần nữa trong ví dụ khác. Hãy để tôi đi trước và mở bản sao-0.c. Tôi cho rằng ví dụ này sẽ cố gắng - nhưng không - sao chép hai dây như sau. Tôi sẽ nói điều gì đó cho người sử dụng. Tôi sau đó sẽ nhận được một chuỗi và gọi nó là s. Và bây giờ, tôi đang làm việc kiểm tra này đây. Chúng tôi đề cập đến điều này một khi trở lại. Nhưng khi có thể nhận được chuỗi trở lại null, một nhân vật đặc biệt, hoặc đặc biệt biểu tượng chúng ta hãy nói. Nếu nó ra khỏi bộ nhớ. Ví dụ, nếu người sử dụng thực sự là khó khăn và các loại một tồi tệ số ký tự tại bàn phím và số truy cập Nhập. Nếu mà số ký tự chỉ có thể không phù hợp với bộ nhớ RAM cho bất cứ điều gì điên lý do, cũng có được chuỗi might rất tốt trả về null. Hoặc nếu chương trình của bạn tự nó được làm rất nhiều những thứ khác và có chỉ không đủ bộ nhớ cho get chuỗi để thành công, nó có thể kết thúc lên trở về null. Nhưng chúng ta hãy chính xác hơn như này là gì. Kiểu dữ liệu s là những gì thực sự? Sao char. Thực ra, bây giờ chúng tôi có thể bóc sao các lớp null. Hóa ra, null là - có, rõ ràng một biểu tượng đặc biệt. Nhưng nó là những gì thực sự? Thực sự, vô giá trị chỉ là một biểu tượng mà chúng ta con người sử dụng để đại diện cho không là tốt. Vì vậy, các tác giả của C, và máy tính nói chung, quyết định năm trước đó, bạn biết những gì. Tại sao chúng ta không đảm bảo rằng không có người dùng dữ liệu là bao giờ, bao giờ, bao giờ bảo quản ở tạm biệt không? Trong thực tế, ngay cả trong ví dụ tùy ý của tôi trước đó, tôi đã không bắt đầu đánh số byte tại số không. Tôi bắt đầu tại một. Bởi vì tôi biết rằng mọi người trên thế giới đã quyết định bảo lưu không byte trong bộ nhớ RAM của bất kỳ ai như một cái gì đó đặc biệt. Lý do là, bất cứ lúc nào bạn muốn báo hiệu rằng một cái gì đó đã đi sai Đối với các địa chỉ với, bạn quay trở lại null - hay còn gọi là không - và bởi vì bạn biết rằng không có legit dữ liệu tại địa chỉ không rõ ràng có nghĩa là một lỗi. Và đó là lý do tại sao chúng ta, theo quy ước, kiểm tra cho null và trở lại một cái gì đó như một trong những trường hợp đó. Vì vậy, nếu chúng ta di chuyển xuống bây giờ, đây chỉ là sau đó một số kiểm tra lỗi, chỉ trong trường hợp một cái gì đó đã đi sai với [? cứu?] hoàn toàn và thoát khỏi chương trình bằng cách quay đầu. Dòng này bây giờ có thể được viết lại như này, có nghĩa là gì? Ở phía bên tay trái, cho tôi một con trỏ đến một nhân vật, và gọi nó là t. Tôi đang lưu trữ những gì bên trong của t, dựa về điều này một dòng mã? Tôi đang lưu trữ một địa điểm. Đặc biệt là vị trí đó là trong s. Vì vậy, nếu người dùng đã gõ trong hello, và mà lần đầu tiên chào xảy ra để kết thúc ở đây, sau đó là số 123 là sẽ trở lại từ được chuỗi và được lưu trữ - như chúng tôi đã nói trước đó - trong s. Khi bây giờ tôi tuyên bố một con trỏ để một char và gọi nó là t, những gì số là nghĩa là sẽ kết thúc trong t theo những câu chuyện? Vì vậy, 123. Vì vậy, về mặt kỹ thuật bây giờ cả hai s và t được trỏ đến chính xác cùng một khối của bộ nhớ. Vì vậy, nhận thấy những gì tôi sẽ làm bây giờ để chứng minh rằng chương trình này là lỗi. Đầu tiên tôi sẽ yêu cầu bồi thường, với một bản in f, tận các bản sao của chuỗi. Sau đó, tôi sẽ làm một ít kiểm tra lỗi. Tôi sẽ đảm bảo. Hãy chắc chắn rằng chuỗi t là ít nhất là lớn hơn không dài, do đó, có một số nhân vật có để thực sự tận dụng. Và sau đó bạn có thể nhớ lại này từ ví dụ trước. 2 trên - đó là trong các tập tin ctype.h. T khung không mang lại cho tôi không ký tự của chuỗi t. Và 2 trên của cùng một giá trị, Tất nhiên, chuyển đổi nó thành chữ hoa. Vì vậy, bằng trực giác, dòng này nhấn mạnh mã được tận dụng đầu tiên thư trong t. Nhưng nó không tận dụng, trực giác, các chữ cái đầu tiên trong s. Nhưng nếu bạn đang suy nghĩ trước, tôi là gì về để xem khi tôi chạy chương trình này và in ra cả hai bản gốc, , và cái gọi là bản sao, t? Họ đang thực sự có được như vậy. Và tại sao họ sẽ giống nhau không? Họ đều trỏ đến chính xác những điều tương tự. Vì vậy, chúng ta hãy làm điều này. Làm sao không. Nó biên dịch OK. Cho phép tôi chạy bản sao không. Hãy để tôi gõ một cái gì đó như chào trong tất cả các chữ thường sau đó nhấn Enter. Và nó tuyên bố rằng cả hai ban đầu của và bản sao có thực sự giống hệt nhau. Vì vậy, những gì thực sự xảy ra ở đây? Hãy để tôi vẽ lại hình ảnh này chỉ kể lại câu chuyện trong một cách hơi khác nhau. Thực sự là những gì đang diễn ra bên dưới mui xe khi tôi tuyên bố một cái gì đó như char bắt đầu, hoặc chuỗi s, Tôi nhận được một con trỏ - mà sẽ xảy ra là bốn byte trong các thiết bị CS50 và trong rất nhiều máy tính. Và tôi sẽ gọi s này. Và điều này hiện có một số giá trị không rõ. Khi bạn khai báo một biến, trừ khi bạn mình đặt một giá trị đó, những người biết những gì đang có. Nó có thể là một số trình tự ngẫu nhiên bit từ thực hiện trước đó. Vì vậy, khi tôi, trong dòng của tôi dùng để làm được chuỗi, và sau đó lưu lại giá trị trong s nhận được chuỗi bằng cách nào đó - và chúng tôi sẽ cuối cùng vỏ lại như thế nào có được công trình chuỗi, bằng cách nào đó phân bổ một mảng có thể trông một chút như thế này. H-E-L-L-O, dấu gạch chéo ngược không. Chúng ta hãy giả sử rằng đây là địa chỉ 123 chỉ thống nhất đầu tiên. Vì vậy, có được lợi nhuận chuỗi, trong nhấn mạnh dòng đó, nó trả về số chúng tôi đã nói, 123. Vì vậy, những gì thực sự diễn ra bên trong của s đây? Vâng, những gì thực sự đi bên trong của s là 123. Nhưng thẳng thắn mà nói, tôi nhận được một chút bối rối bởi tất cả các địa chỉ, tất cả các số bất kỳ. 123, 124, 127. Vì vậy, chúng ta hãy thực sự đơn giản hóa thế giới một chút. Khi chúng ta nói về con trỏ, thẳng thắn, để con người chúng ta, ai có hề quan tâm đến nơi điều này là trong bộ nhớ? Đó là hoàn toàn tùy ý. Nó sẽ phụ thuộc vào cách nhiêu RAM người dùng có. Nó sẽ phụ thuộc vào khi trong ngày bạn chạy chương trình, có lẽ, và những gì đầu vào người sử dụng cung cấp cho bạn. Chúng tôi đang ở trên chi tiết không quan trọng. Vì vậy, chúng ta hãy tóm tắt đi và nói rằng, khi bạn chạy một dòng mã như thế này, char sao không thắng được trở lại giá trị của get chuỗi. Tại sao chúng ta không thay vì chỉ vẽ những gì chúng tôi tiếp tục gọi một con trỏ như thể đó là chỉ vào một cái gì đó? Vì vậy, tôi khẳng định bây giờ mà s lên có một con trỏ - bên dưới mui xe đó là một địa chỉ. Nhưng nó chỉ trỏ đến byte đầu tiên trong chuỗi đó là được trả lại. Nếu bây giờ tôi quay trở lại mã ở đây, những gì đang xảy ra ở dòng này? Vâng, trong này nhấn mạnh dòng bây giờ, Tôi tuyên bố rõ ràng khác biến gọi là t. Nhưng nó cũng là một con trỏ, vì vậy tôi sẽ để vẽ nó như, trong lý thuyết, chính xác hộp cùng kích thước. Và tôi sẽ gọi nó là t. Và bây giờ nếu chúng ta quay trở lại mã một lần nữa, khi tôi lưu trữ s bên trong của t, những gì tôi về mặt kỹ thuật đặt bên trong t? Tốt về mặt kỹ thuật, điều này là số 123. Vì vậy, thực sự tôi nên viết số 123 có. Nhưng chúng ta hãy xem nó cấp cao hơn. t, nếu nó chỉ là một con trỏ, trực giác, chỉ là. Đó là tất cả những gì là được lưu trữ trong đó. Vì vậy, bây giờ trong các đường thú vị nhất mã, khi tôi thực sự đi về tận dụng các nhân vật không trong t, những gì đang xảy ra? Vâng, t khung không được bây giờ chỉ với những gì nhân vật, có lẽ? Nó chỉ vào h. Vì t khung không - nhớ lại, đây là cú pháp cũ. t khung không chỉ có nghĩa là nếu t là một chuỗi, t khung không có nghĩa là nhận được không nhân vật trong sức mạnh. Vì vậy, những gì mà thực sự có nghĩa là là đi đến mảng này - và có, điều này có thể là 123, này có thể là 124. Nhưng đó là tất cả tương đối, hãy nhớ. Bất cứ khi nào nói về một mảng, chúng ta có lợi thế là nói về chỉ số tương đối. Và vì vậy bây giờ chúng ta chỉ có thể giả định mà t khung không là h. Vì vậy, nếu tôi gọi 2 trên trên nó, những gì đó thực sự làm là tận h chữ thường để chữ hoa H. Nhưng tất nhiên, những gì là s? Nó chỉ vào chuỗi darn cùng. Vì vậy, đây là tất cả những gì đã xảy ra trong mã này cho đến nay. Vì vậy, những gì sau đó ngụ ý? Làm thế nào để chúng tôi sửa chữa hai vấn đề này? Làm thế nào để chúng ta so sánh các chuỗi thực tế? Cũng trực giác, như thế nào sẽ bạn đi về so sánh hai dây cho thật sự bình đẳng? Có nghĩa là gì nếu hai chuỗi bằng nhau? Rõ ràng không phải là địa chỉ của họ bằng trong bộ nhớ, bởi vì đó là mức thấp chi tiết thực hiện cấp. Tất cả các nhân vật đều giống nhau. Vì vậy, hãy để tôi đưa ra, và cho tôi giới thiệu trong phiên bản một trong compare.c ở đây, vì vậy so sánh-1.c. Hãy để tôi đề nghị chúng ta vẫn có được một con trỏ được gọi là, và cửa hàng trong nó trả lại giá trị của get chuỗi. Chúng ta hãy làm điều tương tự với t. Vì vậy, không có code là khác nhau. Tôi sẽ thêm một chút hơn kiểm tra tại lỗi. Vì vậy, bây giờ mà chúng tôi đang sắp xếp hé lớp này trong CS50 về những gì một chuỗi thực sự là, chúng ta cần phải qua đường hậu môn hơn về việc bảo đảm chúng ta không nên lạm dụng giá trị không hợp lệ như vô giá trị. Vì vậy, tôi chỉ cần đi để kiểm tra. Nếu anh không vô giá trị như nhau và t không vô giá trị như nhau, có nghĩa là chúng tôi OK. Được chuỗi không vít lên nhận một trong những chuỗi. Và bạn có lẽ có thể đoán bây giờ, những gì không STR CMP có lẽ làm gì? Chuỗi so sánh. Vì vậy, nếu bạn đã chương trình trong java trước, điều này cũng giống như các phương pháp bằng trong lớp chuỗi. Nhưng đối với những người bạn của những người có không lập trình trước, đây chỉ là một chức năng c. Nó xảy ra cho đến trong một tập tin gọi là string.h. Đó là nơi mà nó được khai báo. Và chuỗi so sánh - Tôi thực sự quên sử dụng của nó, nhưng không bao giờ nhớ rằng. Nhớ lại rằng chúng tôi có thể làm người đàn ông, khuấy động so sánh. Và điều này sẽ mang đến những Linux lập trình bằng tay. Và đó là, thẳng thắn, một chút khó hiểu. Nhưng tôi có thể thấy ở đây là, vâng. Tôi phải bao gồm string.h. Và nó nói ở đây theo mô tả, "các chuỗi chức năng so sánh so sánh hai chuỗi S1 và S2. "Và S1 và S2 là rõ ràng là hai lập luận thông qua nhập Tôi không thực sự nhớ những gì const là, nhưng bây giờ thấy - và bạn có thể thấy điều này khi đã bạn đã sử dụng các trang người đàn ông nếu bạn có tất cả - mà sao char chỉ là đồng nghĩa với chuỗi. Vì vậy, nó sẽ so sánh hai dây, S1 và S2, và nó sẽ trả về một số nguyên ít hơn hơn hoặc bằng hoặc lớn hơn không nếu S1 được tìm thấy, tương ứng, để được ít hơn, hoặc kết hợp, hoặc lớn hơn S2. Đó chỉ là một cách rất phức tạp để nói rằng chuỗi so sánh lợi nhuận không nếu hai chuỗi bằng trực giác giống hệt nhau, nhân vật cho nhân vật cho nhân vật. Nó trả về một số âm nếu s, theo thứ tự abc, là nghĩa vụ đến trước t. Hoặc trả về một số dương nếu s là nghĩa vụ phải đến sau khi t theo thứ tự abc. Vì vậy, với chức năng này đơn giản, có thể bạn, ví dụ, sắp xếp một bó toàn bộ các từ ngữ? Vì vậy, trong phiên bản mới này, tôi sẽ đi trước và làm cho compare1. Dot dấu gạch chéo so sánh một. Tôi sẽ gõ vào xin chào trong tất cả các trường hợp thấp hơn. Tôi sẽ gõ vào xin chào trong tất cả các chữ thường một lần nữa. Và may mắn bây giờ nó nhận ra Tôi đã gõ cùng một điều. Trong khi đó, nếu tôi gõ vào xin chào trong thấp hơn trường hợp và Hello trong trường hợp trên và so sánh chúng, tôi đã gõ những thứ khác nhau. Bởi vì không chỉ là địa chỉ khác nhau, nhưng chúng ta đang so sánh nhân vật khác nhau một lần nữa và một lần nữa. Vâng chúng ta hãy đi và sửa chữa một vấn đề khác hiện nay. Hãy để tôi mở ra một trong những phiên bản bản sao, mà giờ đây giải thích vấn đề này như sau. Và một điều này sẽ trông một chút phức tạp hơn. Nhưng nếu bạn suy nghĩ về vấn đề gì, chúng tôi cần phải giải quyết, hy vọng điều này sẽ được rõ ràng chỉ trong một thời điểm bây giờ. Vì vậy, dòng đầu tiên này, char bắt đầu t, trong điều khoản của layman ai đó có thể đề xuất những dòng này ở đây nghĩa là gì? Char sao t, những gì là làm gì? Tốt. Tạo ra một con trỏ đến một số vị trí trong bộ nhớ. Và cho tôi tinh chỉnh nó một chút. Khai báo một biến sẽ lưu trữ địa chỉ của một số char trong bộ nhớ, chỉ cần có một chút thích hợp hơn. OK, vì vậy bây giờ ở phía bên tay phải, tôi đã không bao giờ nhìn thấy một trong những chức năng trước, malloc. Nhưng những gì mà có thể nghĩa là gì? Cấp phát bộ nhớ. Cấp phát bộ nhớ. Vì vậy, nó quay ra, cho đến bây giờ, chúng tôi đã không thực sự có một cách mạnh mẽ của yêu cầu hệ điều hành, cung cấp cho tôi một số bộ nhớ. Thay vào đó, chúng ta có một chức năng được gọi là malloc thực hiện chính xác đó. Mặc dù đây là một chút của một mất tập trung ngay bây giờ, nhận thấy rằng trong giữa hai dấu ngoặc đơn là chỉ có được một số. Nơi tôi đã nhập vào câu hỏi dấu hiệu có thể là một số. Và con số này có nghĩa là, cho tôi 10 byte. Cho tôi 20 byte. Cho tôi 100 byte. Và malloc sẽ làm hết sức mình để yêu cầu hệ điều hành - Linux, trong trường hợp này - hey, là 100 byte của họ RAM có sẵn? Nếu như vậy, trả lại những byte cho tôi trả lại địa chỉ đó của những byte, có lẽ? Việc đầu tiên một. Vì vậy, ở đây - và đây là chủ yếu trong C, bất cứ lúc nào bạn đối phó với các địa chỉ? Bạn gần như luôn luôn đối phó với các địa chỉ đầu tiên như vậy, không có vấn đề lớn như thế nào một đoạn bộ nhớ bạn đang được giao lại, có thể nói. Vì vậy, chúng ta hãy đi sâu vào đây. Tôi cố gắng để phân bổ như thế nào nhiều byte, chính xác? Tốt. Chiều dài chuỗi s - hãy làm một ví dụ cụ thể. Nếu s là xin chào, H-E-L-L-O, là những gì chiều dài chuỗi s, rõ ràng? Vì vậy, năm. Nhưng tôi đang làm một cộng thêm 1 vào đó, tại sao? Tại sao tôi muốn sáu byte thay vì năm? Các ký tự null. Tôi không muốn rời khỏi đây vật vô giá trị đặc biệt. Bởi vì nếu tôi làm cho một bản sao của Xin chào và chỉ cần làm H-E-L-L-O, nhưng tôi không đặt rằng nhân vật đặc biệt, máy tính có thể không có, bởi cơ hội, một dấu chéo ngược bằng không có cho tôi. Và do đó, nếu tôi đang cố gắng để tìm ra chiều dài của bản sao, tôi có thể nghĩ rằng nó dài 20 ký tự, hoặc một triệu ký tự nếu tôi chưa bao giờ xảy ra đánh một dấu chéo ngược không. Vì vậy, chúng ta cần sáu byte để lưu trữ H-E-L-L-O, dấu gạch chéo ngược không. Và sau đó điều này chỉ là được siêu hậu môn. Giả sử tôi quên những gì kích thước của một char. Chúng tôi luôn nói đó là một byte. Và nó thường là. Về lý thuyết, nó có thể là một cái gì đó khác nhau, trên một máy Mac khác nhau hoặc một máy tính khác nhau. Thực ra, có nhà điều hành này gọi là sizeof rằng nếu bạn vượt qua nó tên của một kiểu dữ liệu - như char hoặc int, hoặc thả nổi - nó sẽ cho bạn biết, năng động, bao nhiêu byte một char chiếm trên này đặc biệt là máy tính. Vì vậy, đây là hiệu quả chỉ như nói lần 1 hoặc Thời gian không có gì cả. Nhưng tôi đang làm việc đó chỉ để được siêu hậu môn, rằng chỉ trong trường hợp một char khác trên máy tính so với tôi của bạn, bằng cách này toán học luôn luôn là sẽ kiểm tra. Cuối cùng, ở đây tôi kiểm tra null, mà luôn luôn là tốt thực hành - một lần nữa, bất cứ lúc nào chúng tôi đang làm việc với con trỏ. Nếu malloc là không thể cung cấp cho tôi sáu tạm biệt - đó là không, nhưng chỉ trong trường hợp - trả lại một ngay lập tức. Và bây giờ, đi trước và sao chép chuỗi như sau. Và đây là cú pháp quen thuộc, mặc dù trong một vai trò khác nhau. Tôi sẽ đi trước và có được chuỗi chiều dài của s và lưu trữ nó trong n. Tôi sau đó sẽ lặp từ i bằng bằng không lên đến và bao gồm cả n, lớn hơn hoặc bằng. Vì vậy mà trên mỗi lần lặp, tôi đặt nhân vật thứ i của s trong thứ i nhân vật của t. Vì vậy, những gì đang thực sự xảy ra bên dưới mui xe đây? Vâng, nếu điều này, ví dụ, là s - và tôi đã gõ vào từ H-E-L-L-O và có một dấu gạch chéo ngược không. Và một lần nữa, đây là s chỉ ở đây. Và ở đây bây giờ là t. Và điều này là chỉ bây giờ để một bản sao của bộ nhớ, phải không? Malloc đã cho tôi toàn bộ đoạn bộ nhớ. Tôi không biết những gì ban đầu trong bất kỳ của các địa điểm này. Vì vậy, tôi sẽ nghĩ về những như một bó toàn bộ các dấu hỏi. Nhưng ngay sau khi tôi bắt đầu vòng lặp từ con số không trên lên thông qua độ dài của s, t khung không và t khung 1 - và tôi sẽ đặt này ngay bây giờ trên chi phí - t khung không và s khung không có nghĩa là rằng tôi sẽ được sao chép lặp đi lặp lại h trong đây, E-L-L-O. Thêm vào đó, bởi vì tôi đã cộng 1, dấu gạch chéo ngược không. Vì vậy, bây giờ trong trường hợp so sánh-1.c, cuối cùng, nếu tôi in ra vốn hóa của t, chúng ta nên thấy rằng s là không thay đổi. Hãy để tôi đi trước và bây giờ làm điều này. Vì vậy, hãy copy1. Dot dấu gạch chéo copy1. Tôi sẽ gõ vào xin chào, Enter. Và bây giờ nhận thấy, chỉ có bản sao đã được vốn hóa. Bởi vì tôi thực sự có hai khối của bộ nhớ. Thật không may, bạn có thể làm một số khá những điều xấu và khá nguy hiểm ở đây. Hãy để tôi kéo lên một ví dụ ở đây bây giờ, cung cấp cho chúng tôi một ví dụ về một vài dòng khác nhau. Vì vậy, chỉ bằng trực giác ở đây, dòng đầu tiên mã, sao int x, được tuyên bố một biến gọi là x. Và các kiểu dữ liệu là những gì của biến đó? Kiểu dữ liệu của biến đó là những gì? Đó không phải là cliffhanger. Các kiểu dữ liệu là int sao. Vì vậy, điều đó không có nghĩa là gì? x sẽ lưu trữ địa chỉ của một int. Đơn giản như vậy. Y sẽ lưu trữ các địa chỉ của một int. Dòng thứ ba là những gì mã làm gì ở đó? Nó được phân bổ bao nhiêu byte, rất có thể? Bốn. Vì kích thước của một int là nói chung là bốn, malloc bốn cho tôi trở lại địa chỉ của một đoạn bộ nhớ, lần đầu tiên có byte là được lưu trữ tại trong x. Bây giờ chúng tôi đang di chuyển một chút nhanh chóng. Sao x có nghĩa là gì? Nó có nghĩa là đi đến địa chỉ đó và đặt những gì số đó? Đưa số 42 đó. Sao y có nghĩa là đi đến những gì ở y và đưa ra con số 13 đó. Nhưng chờ một phút. Là những gì trong y vào lúc này? Địa chỉ những gì là y lưu trữ? Chúng tôi không biết, phải không? Chúng tôi chưa bao giờ một lần sử dụng sự phân công nhà điều hành liên quan đến y. Vì vậy, y như tuyên bố trên dòng thứ hai của đang chỉ là một số giá trị rác, một lớn dấu hỏi vậy để nói chuyện. Nó có thể được chỉ ngẫu nhiên để bất cứ điều gì trong bộ nhớ, mà nói chung là xấu. Vì vậy, ngay khi chúng tôi đánh dòng đó, sao y = 13, cái gì xấu, một cái gì đó rất xấu là về xảy ra với Binky. Vì vậy, chúng ta hãy xem những gì sẽ kết thúc xảy ra với Binky đây trong phút này hoặc để xem. [VIDEO xem lại] -Này, Binky. Thức dậy. Đó là thời gian cho con trỏ vui vẻ. -Cái gì thế? Tìm hiểu về con trỏ? Oh, goodie. -Vâng, để bắt đầu, tôi đoán chúng tôi sẽ cần một vài gợi ý. -OK. Mã này cấp phát hai con trỏ mà có thể trỏ đến số nguyên. -OK, tốt, tôi nhìn thấy hai con trỏ. Nhưng họ dường như không được trỏ đến bất cứ điều gì. -Đúng vậy. Ban đầu, con trỏ không trỏ đến bất cứ điều gì. Những điều họ chỉ để được gọi là pointees, và thiết lập chúng là một bước riêng biệt. -Oh, đúng rồi. Tôi biết điều đó. Các pointees là riêng biệt. Vì vậy, làm thế nào để bạn phân bổ một pointee? -OK. Vâng, mã này phân bổ một số nguyên mới pointee, và phần này đặt x để trỏ đến nó. -Này, trông tốt hơn. Vì vậy, làm cho nó làm một cái gì đó. -OK. Tôi sẽ tới đích của con trỏ x để lưu trữ số 42 vào pointee của nó. Đối với thủ thuật này, tôi sẽ cần ma thuật của tôi cây đũa phép của dereferencing. -Bạn cây đũa thần của dereferencing? Uh, đó là tuyệt vời. -Đây là những gì mã trông như thế nào. Tôi sẽ chỉ cần thiết lập số lượng, và - -Này, nhìn xem. Có nó đi. Vì vậy, làm một tới đích trên x sau mũi tên để truy cập pointee của nó. Trong trường hợp này, để lưu trữ 42 trong đó. Này, hãy thử sử dụng nó để lưu trữ các số 13 thông qua con trỏ khác, y. -OK. Tôi sẽ chỉ đi qua đây để y và được con số 13 thiết lập. Và sau đó lấy cây đũa phép của dereferencing và chỉ - whoa! -Oh, hey. Mà không làm việc. Nói, Binky, tôi không nghĩ rằng dereferencing y là một ý tưởng tốt, vì lập pointee là một bước riêng biệt. Và tôi không nghĩ rằng chúng tôi đã làm nó. -Hmm. Tốt điểm. -Vâng, chúng tôi phân bổ y con trỏ. Nhưng chúng tôi không bao giờ đặt nó vào trỏ đến một pointee. -Hmm. Rất tinh ý. -Này, bạn đang tìm kiếm tốt có, Binky. Bạn có thể sửa chữa nó để y điểm đến pointee giống như x? -Chắc chắn. Tôi sẽ sử dụng cây đũa thần của tôi giao con trỏ. -Đó có phải là sẽ là một vấn đề như trước đây? -Không. Điều này không chạm vào pointees. Nó chỉ thay đổi một con trỏ trỏ để những điều tương tự như nhau. -Ồ, tôi nhìn thấy. Bây giờ y chỉ vào cùng một vị trí như x. Vì vậy, chờ đợi. Bây giờ y là cố định. Nó có một pointee. Vì vậy, bạn có thể thử các cây đũa phép của dereferencing lại để gửi 13 hơn. -OK. Ở đây đi. -Này, nhìn vào đó. Bây giờ dereferencing công trình trên y. Và bởi vì con trỏ được chia sẻ rằng một pointee, họ cả hai thấy 13. -Vâng. Chia sẻ. Bất cứ điều gì. Vì vậy, chúng ta sẽ đổi vị trí bây giờ? -Oh, nhìn. Chúng ta hết thời gian. -Nhưng - -Chỉ cần nhớ ba quy định con trỏ. Thứ nhất, cấu trúc cơ bản là bạn có một con trỏ. Và nó chỉ qua một pointee. Nhưng con trỏ và pointee là riêng biệt. Và các lỗi phổ biến là thiết lập một con trỏ, nhưng đến quên để cho một pointee. Số hai, dereferencing con trỏ bắt đầu tại con trỏ và sau của nó mũi tên lên trên để truy cập pointee của nó. Như chúng ta đều biết, điều này chỉ hoạt động nếu có là một pointee, mà được trở lại cai trị số một. Số ba, giao con trỏ có một con trỏ và thay đổi nó để trỏ đến các pointee giống như một con trỏ. Vì vậy, sau khi chuyển nhượng, hai con trỏ sẽ trỏ đến pointee cùng. Đôi khi đó được gọi là chia sẻ. Và đó là tất cả để có nó, thực sự. Bye bye bây giờ. [END xem video] DAVID Malan: Vì vậy, hơn trên con trỏ, hơn trên Binky tuần tới. Chúng ta sẽ thấy bạn vào thứ hai.