1 00:00:00,000 --> 00:00:06,030 >> [MUSIC CHƠI] 2 00:00:06,030 --> 00:00:08,390 >> DOUG LLOYD: Con trỏ, ở đây chúng tôi đang có. 3 00:00:08,390 --> 00:00:11,080 Điều này có lẽ sẽ là chủ đề khó khăn nhất 4 00:00:11,080 --> 00:00:12,840 rằng chúng ta nói về trong CS50. 5 00:00:12,840 --> 00:00:15,060 Và nếu bạn đã đọc bất cứ điều gì về con trỏ 6 00:00:15,060 --> 00:00:19,080 trước khi bạn có thể là một chút đáng sợ đi vào video này. 7 00:00:19,080 --> 00:00:21,260 Đó là sự thật các con trỏ làm cho phép bạn khả năng 8 00:00:21,260 --> 00:00:23,740 để có thể vít lên khá nặng khi bạn 9 00:00:23,740 --> 00:00:27,450 làm việc với các biến, và dữ liệu, và gây ra chương trình của bạn để sụp đổ. 10 00:00:27,450 --> 00:00:30,490 Nhưng chúng thực sự hữu ích và họ cho phép chúng ta một cách thực sự tuyệt vời 11 00:00:30,490 --> 00:00:33,340 để truyền dữ liệu trở lại và ra giữa các chức năng, 12 00:00:33,340 --> 00:00:35,490 rằng chúng tôi khác không thể làm được. 13 00:00:35,490 --> 00:00:37,750 >> Và vì vậy những gì chúng ta thực sự muốn làm ở đây là tàu 14 00:00:37,750 --> 00:00:41,060 bạn phải có kỷ luật con trỏ tốt, vì vậy mà bạn có thể sử dụng con trỏ một cách hiệu quả 15 00:00:41,060 --> 00:00:43,850 để làm cho chương trình của bạn là tốt hơn nhiều. 16 00:00:43,850 --> 00:00:48,220 Như tôi đã nói con trỏ cho chúng ta một khác nhau cách để truyền dữ liệu giữa các chức năng. 17 00:00:48,220 --> 00:00:50,270 Bây giờ nếu bạn nhớ lại từ một video trước đó, khi 18 00:00:50,270 --> 00:00:53,720 chúng tôi đã nói về phạm vi biến, tôi đã đề cập 19 00:00:53,720 --> 00:01:00,610 rằng tất cả các dữ liệu mà chúng tôi vượt qua giữa chức năng trong C là tham trị. 20 00:01:00,610 --> 00:01:03,070 Và tôi có thể không đã sử dụng mà hạn, những gì tôi có nghĩa là có 21 00:01:03,070 --> 00:01:07,170 là chúng tôi đang đi qua các bản sao của dữ liệu. 22 00:01:07,170 --> 00:01:12,252 Khi chúng tôi vượt qua một biến cho một chức năng, chúng ta không thực sự đi qua các biến 23 00:01:12,252 --> 00:01:13,210 đến chức năng, phải không? 24 00:01:13,210 --> 00:01:17,670 Chúng tôi đang đi qua một bản sao của rằng dữ liệu cho hàm. 25 00:01:17,670 --> 00:01:20,760 Chức năng làm những gì nó sẽ và nó tính toán một số giá trị, 26 00:01:20,760 --> 00:01:23,180 và có lẽ chúng ta sử dụng giá trị đó khi nó mang lại cho nó trở lại. 27 00:01:23,180 --> 00:01:26,700 >> Có một ngoại lệ quy tắc này đi ngang qua giá trị, 28 00:01:26,700 --> 00:01:31,210 và chúng tôi sẽ trở lại với những gì mà là một chút sau này trong video này. 29 00:01:31,210 --> 00:01:34,880 Nếu chúng ta sử dụng con trỏ thay của việc sử dụng các biến, 30 00:01:34,880 --> 00:01:38,180 hoặc thay vì sử dụng các biến bản thân hoặc bản sao của các biến, 31 00:01:38,180 --> 00:01:43,790 bây giờ chúng tôi có thể vượt qua các biến xung quanh giữa các chức năng một cách khác nhau. 32 00:01:43,790 --> 00:01:46,550 Điều này có nghĩa rằng nếu chúng ta một sự thay đổi trong một chức năng, 33 00:01:46,550 --> 00:01:49,827 sự thay đổi đó sẽ thực sự mất ảnh hưởng trong một chức năng khác nhau. 34 00:01:49,827 --> 00:01:52,160 Một lần nữa, đây là một cái gì đó chúng tôi không thể làm được trước đó, 35 00:01:52,160 --> 00:01:56,979 và nếu bạn đã bao giờ cố gắng để trao đổi giá trị của hai biến trong một hàm, 36 00:01:56,979 --> 00:01:59,270 bạn đã nhận thấy vấn đề này loại leo lên, phải không? 37 00:01:59,270 --> 00:02:04,340 >> Nếu chúng tôi muốn trao đổi X và Y, và chúng tôi vượt qua họ để một chức năng gọi là trao đổi, 38 00:02:04,340 --> 00:02:08,680 bên trong của hàm trao đổi biến làm giá trị trao đổi. 39 00:02:08,680 --> 00:02:12,600 Một trở thành hai, hai thành một, nhưng chúng tôi không thực sự 40 00:02:12,600 --> 00:02:16,890 thay đổi bất cứ điều gì trong bản gốc chức năng, trong người gọi. 41 00:02:16,890 --> 00:02:19,550 Bởi vì chúng ta không có thể, chúng tôi chỉ làm việc với các bản sao của chúng. 42 00:02:19,550 --> 00:02:24,760 Với con trỏ mặc dù, chúng ta có thể thực sự vượt qua X và Y để một chức năng. 43 00:02:24,760 --> 00:02:26,960 Đó là chức năng có thể làm một cái gì đó với họ. 44 00:02:26,960 --> 00:02:29,250 Và những biến các giá trị thực sự có thể thay đổi. 45 00:02:29,250 --> 00:02:33,710 Vì vậy, đó là khá một sự thay đổi trong khả năng của chúng tôi để làm việc với dữ liệu. 46 00:02:33,710 --> 00:02:36,100 >> Trước khi chúng ta đi sâu vào con trỏ, tôi nghĩ rằng nó có giá trị 47 00:02:36,100 --> 00:02:38,580 tham gia một vài phút để quay trở lại vấn đề cơ bản ở đây. 48 00:02:38,580 --> 00:02:41,000 Và có một cái nhìn như thế nào công trình bộ nhớ máy tính 49 00:02:41,000 --> 00:02:45,340 vì hai đối tượng này đang đi để thực sự là khá tương quan với nhau. 50 00:02:45,340 --> 00:02:48,480 Như bạn đã biết, trên hệ thống máy tính của bạn 51 00:02:48,480 --> 00:02:51,310 bạn có một ổ đĩa cứng hoặc có lẽ một ổ trạng thái rắn, 52 00:02:51,310 --> 00:02:54,430 một số loại vị trí lưu trữ tập tin. 53 00:02:54,430 --> 00:02:57,950 Nó thường là một nơi nào đó trong khu phố của 250 gigabytes 54 00:02:57,950 --> 00:02:59,810 để có thể một vài terabyte bây giờ. 55 00:02:59,810 --> 00:03:02,270 Và đó là nơi mà tất cả các bạn các tập tin cuối cùng sống, 56 00:03:02,270 --> 00:03:04,870 ngay cả khi máy tính của bạn được đóng tắt, bạn có thể biến nó trở lại 57 00:03:04,870 --> 00:03:09,190 và bạn sẽ tìm thấy các tập tin của bạn đang có một lần nữa khi bạn khởi động lại hệ thống của bạn. 58 00:03:09,190 --> 00:03:14,820 Nhưng các ổ đĩa, giống như một ổ đĩa cứng, một ổ cứng, hoặc một ổ đĩa trạng thái rắn, ổ SSD, 59 00:03:14,820 --> 00:03:16,050 là không gian lưu trữ chỉ. 60 00:03:16,050 --> 00:03:20,400 >> Chúng tôi có thể không thực sự làm bất cứ điều gì với các dữ liệu đó là trong đĩa cứng, 61 00:03:20,400 --> 00:03:22,080 hoặc trong một ổ đĩa trạng thái rắn. 62 00:03:22,080 --> 00:03:24,950 Để thực sự thay đổi dữ liệu hoặc di chuyển nó xung quanh, 63 00:03:24,950 --> 00:03:28,800 chúng ta phải di chuyển nó đến RAM, bộ nhớ truy cập ngẫu nhiên. 64 00:03:28,800 --> 00:03:31,170 Bây giờ RAM, bạn có rất nhiều ít trong máy tính của bạn. 65 00:03:31,170 --> 00:03:34,185 Bạn có thể có một nơi nào đó trong khu phố của 512 MB 66 00:03:34,185 --> 00:03:38,850 nếu bạn có một máy tính cũ, để có thể hai, bốn, tám, 16, 67 00:03:38,850 --> 00:03:41,820 thậm chí có một chút hơn, GB bộ nhớ RAM. 68 00:03:41,820 --> 00:03:46,390 Vì vậy, đó là nhỏ hơn nhiều, nhưng đó là nơi mà tất cả các dữ liệu dễ bay hơi tồn tại. 69 00:03:46,390 --> 00:03:48,270 Đó là nơi mà chúng ta có thể thay đổi mọi thứ. 70 00:03:48,270 --> 00:03:53,350 Nhưng khi chúng ta bật máy tính của chúng tôi ra, tất cả các dữ liệu trong bộ nhớ RAM bị phá hủy. 71 00:03:53,350 --> 00:03:57,150 >> Vì vậy, đó là lý do tại sao chúng ta cần phải có đĩa cứng cho các vị trí lâu dài hơn của nó, 72 00:03:57,150 --> 00:03:59,720 để nó exists- nó sẽ được thực sự xấu nếu mỗi lần chúng tôi 73 00:03:59,720 --> 00:04:03,310 bật máy tính của chúng tôi ra, mỗi tập tin trong hệ thống của chúng tôi đã được xóa sạch. 74 00:04:03,310 --> 00:04:05,600 Vì vậy, chúng tôi làm việc bên trong bộ nhớ RAM. 75 00:04:05,600 --> 00:04:09,210 Và mỗi khi chúng ta đang nói về bộ nhớ, khá nhiều, trong CS50, 76 00:04:09,210 --> 00:04:15,080 chúng ta đang nói về bộ nhớ RAM, ổ cứng không. 77 00:04:15,080 --> 00:04:18,657 >> Vì vậy, khi chúng tôi di chuyển mọi thứ vào bộ nhớ, nó chiếm một số tiền nhất định của không gian. 78 00:04:18,657 --> 00:04:20,740 Tất cả các loại dữ liệu mà chúng tôi đã làm việc với 79 00:04:20,740 --> 00:04:23,480 mất nhau lượng của không gian trong bộ nhớ RAM. 80 00:04:23,480 --> 00:04:27,600 Vì vậy, mỗi khi bạn tạo ra một số nguyên biến, bốn byte của bộ nhớ 81 00:04:27,600 --> 00:04:30,750 được đặt sang một bên trong bộ nhớ RAM, do đó bạn có thể làm việc với số nguyên đó. 82 00:04:30,750 --> 00:04:34,260 Bạn có thể khai báo các số nguyên, thay đổi nó, gán cho nó 83 00:04:34,260 --> 00:04:36,700 đến một giá trị tăng lên 10 một, vv và vv. 84 00:04:36,700 --> 00:04:39,440 Tất cả những gì cần phải xảy ra RAM, và bạn nhận được bốn byte 85 00:04:39,440 --> 00:04:42,550 để làm việc với cho mỗi nguyên mà bạn tạo ra. 86 00:04:42,550 --> 00:04:45,410 >> Mỗi nhân vật bạn tạo được một byte. 87 00:04:45,410 --> 00:04:48,160 Đó chỉ là bao nhiêu không gian cần thiết để lưu trữ một nhân vật. 88 00:04:48,160 --> 00:04:51,310 Mỗi float, một thực tế số, được bốn byte 89 00:04:51,310 --> 00:04:53,390 trừ khi đó là một đôi độ chính xác điểm nổi 90 00:04:53,390 --> 00:04:56,510 số lượng, mà cho phép bạn có chữ số chính xác hơn hoặc nhiều hơn 91 00:04:56,510 --> 00:04:59,300 sau dấu thập phân mà không làm mất độ chính xác, 92 00:04:59,300 --> 00:05:01,820 mà mất đến tám byte của bộ nhớ. 93 00:05:01,820 --> 00:05:06,730 Chờ đợi lâu, số nguyên thực sự lớn, cũng mất tám byte của bộ nhớ. 94 00:05:06,730 --> 00:05:09,000 Có bao nhiêu byte bộ nhớ làm dây mất? 95 00:05:09,000 --> 00:05:12,990 Vâng chúng ta hãy đặt một chân trong câu hỏi đó cho bây giờ, nhưng chúng tôi sẽ trở lại với nó. 96 00:05:12,990 --> 00:05:17,350 >> Vì vậy, trở lại ý tưởng này của bộ nhớ như một mảng lớn của các tế bào byte kích thước. 97 00:05:17,350 --> 00:05:20,871 Đó thực sự là tất cả nó là, nó chỉ là một mảng rất lớn của các tế bào, 98 00:05:20,871 --> 00:05:23,370 giống như các mảng khác mà bạn đã quen thuộc với và xem, 99 00:05:23,370 --> 00:05:26,430 trừ mọi phần tử là rộng một byte. 100 00:05:26,430 --> 00:05:30,030 Và cũng giống như một mảng, mỗi phần tử có một địa chỉ. 101 00:05:30,030 --> 00:05:32,120 Mỗi phần tử của một mảng có một chỉ số, và chúng tôi 102 00:05:32,120 --> 00:05:36,302 có thể sử dụng chỉ số đó để làm cái gọi là truy cập ngẫu nhiên trên mảng. 103 00:05:36,302 --> 00:05:38,510 Chúng tôi không cần phải bắt đầu từ đầu của mảng, 104 00:05:38,510 --> 00:05:40,569 lặp qua mỗi yếu tố duy nhất của chúng, 105 00:05:40,569 --> 00:05:41,860 để tìm thấy những gì chúng tôi đang tìm kiếm. 106 00:05:41,860 --> 00:05:45,790 Chúng tôi chỉ có thể nói, tôi muốn để có được các Yếu tố thứ 15 hoặc các yếu tố thứ 100. 107 00:05:45,790 --> 00:05:49,930 Và bạn chỉ có thể vượt qua trong số đó và nhận được những giá trị mà bạn đang tìm kiếm. 108 00:05:49,930 --> 00:05:54,460 >> Tương tự như vậy mỗi địa điểm trong bộ nhớ có địa chỉ. 109 00:05:54,460 --> 00:05:57,320 Vì vậy, bộ nhớ của bạn có thể giống như thế này. 110 00:05:57,320 --> 00:06:01,420 Dưới đây là một đoạn rất nhỏ bộ nhớ, điều này là 20 byte của bộ nhớ. 111 00:06:01,420 --> 00:06:04,060 20 byte đầu tiên bởi vì tôi địa chỉ có ở phía dưới 112 00:06:04,060 --> 00:06:08,890 là 0, 1, 2, 3, và như vậy trên tất cả các con đường lên đến 19. 113 00:06:08,890 --> 00:06:13,190 Và khi tôi khai báo các biến và khi tôi bắt đầu làm việc với họ, 114 00:06:13,190 --> 00:06:15,470 hệ thống sẽ thiết lập dành một không gian đối với tôi 115 00:06:15,470 --> 00:06:17,595 trong bộ nhớ này để làm việc với các biến số của tôi. 116 00:06:17,595 --> 00:06:21,610 Vì vậy, tôi có thể nói, char c bằng vốn H. Và điều gì sẽ xảy ra? 117 00:06:21,610 --> 00:06:23,880 Vâng hệ thống sẽ dành cho tôi một byte. 118 00:06:23,880 --> 00:06:27,870 Trong trường hợp này nó đã chọn số byte bốn, các byte tại địa chỉ bốn, 119 00:06:27,870 --> 00:06:31,310 và nó sẽ lưu trữ H vốn thư trong đó cho tôi. 120 00:06:31,310 --> 00:06:34,350 Nếu tôi sau đó nói int tốc độ hạn bằng 65, đó là 121 00:06:34,350 --> 00:06:36,806 sẽ dành bốn byte của bộ nhớ đối với tôi. 122 00:06:36,806 --> 00:06:39,180 Và nó sẽ đối xử với những người bốn byte như là một đơn vị duy nhất 123 00:06:39,180 --> 00:06:41,305 bởi vì những gì chúng tôi đang làm việc với là một số nguyên ở đây. 124 00:06:41,305 --> 00:06:44,350 Và nó sẽ lưu trữ 65 trong đó. 125 00:06:44,350 --> 00:06:47,000 >> Bây giờ đã được tôi là loại nói cho bạn một chút của một lời nói dối, 126 00:06:47,000 --> 00:06:50,150 đúng, bởi vì chúng ta biết rằng máy tính làm việc trong hệ nhị phân. 127 00:06:50,150 --> 00:06:53,100 Họ không hiểu nhất thiết những gì một H vốn là 128 00:06:53,100 --> 00:06:57,110 hoặc những gì một là 65, họ chỉ hiểu nhị phân, số không và những người thân. 129 00:06:57,110 --> 00:06:59,000 Và do đó, thực tế những gì chúng tôi đang lưu trữ trong đó 130 00:06:59,000 --> 00:07:03,450 không phải là H thư và số 65, mà là cơ quan đại diện nhị phân 131 00:07:03,450 --> 00:07:06,980 của chúng, mà nhìn một chút gì đó như thế này. 132 00:07:06,980 --> 00:07:10,360 Và đặc biệt trong bối cảnh của biến số nguyên, 133 00:07:10,360 --> 00:07:13,559 nó không phải đi để chỉ nhổ nó vào, nó sẽ không đối xử với nó như là một trong bốn 134 00:07:13,559 --> 00:07:15,350 byte đoạn nhất thiết, nó thực sự đi 135 00:07:15,350 --> 00:07:19,570 để xử lý nó như một khối bốn byte, mà có thể giống như thế này. 136 00:07:19,570 --> 00:07:22,424 Và ngay cả điều này không phải là hoàn toàn đúng, hoặc, 137 00:07:22,424 --> 00:07:24,840 vì cái gì đó gọi một endianness, mà chúng tôi không 138 00:07:24,840 --> 00:07:26,965 sẽ nhận được vào lúc này, nhưng nếu bạn đang tò mò về, 139 00:07:26,965 --> 00:07:29,030 bạn có thể đọc lên trên ít và endianness lớn. 140 00:07:29,030 --> 00:07:31,640 Nhưng vì lợi ích của lập luận này, vì lợi ích của video này, 141 00:07:31,640 --> 00:07:34,860 chúng ta hãy giả định rằng, trong Thực tế, làm thế nào số 65 sẽ 142 00:07:34,860 --> 00:07:36,970 được đại diện trong bộ nhớ trên mỗi hệ thống, 143 00:07:36,970 --> 00:07:38,850 mặc dù nó không hoàn toàn đúng. 144 00:07:38,850 --> 00:07:41,700 >> Nhưng chúng ta hãy thực sự chỉ có được thoát khỏi tất cả nhị phân hoàn toàn, 145 00:07:41,700 --> 00:07:44,460 và chỉ nghĩ về như H và 65, nó dễ dàng hơn rất nhiều 146 00:07:44,460 --> 00:07:47,900 để suy nghĩ về nó như thế mà như một con người. 147 00:07:47,900 --> 00:07:51,420 Tất cả các quyền, do đó, nó cũng có vẻ như có thể một ít ngẫu nhiên mà I've- hệ thống của tôi 148 00:07:51,420 --> 00:07:55,130 đã không cho tôi byte 5, 6, 7, và 8 để lưu trữ các số nguyên. 149 00:07:55,130 --> 00:07:58,580 Có một lý do cho rằng, quá, mà chúng tôi sẽ không nhận được vào ngay bây giờ, nhưng đủ 150 00:07:58,580 --> 00:08:00,496 nó nói rằng những gì máy tính đang làm gì ở đây 151 00:08:00,496 --> 00:08:02,810 có lẽ là một động thái tốt về phần mình. 152 00:08:02,810 --> 00:08:06,020 Để không cho tôi nhớ đó là nhất thiết phải trở lại để trở lại. 153 00:08:06,020 --> 00:08:10,490 Mặc dù nó sẽ làm ngay bây giờ nếu tôi muốn có được một chuỗi khác, 154 00:08:10,490 --> 00:08:13,080 gọi tên họ, và tôi muốn để đưa Lloyd trong đó. 155 00:08:13,080 --> 00:08:18,360 Tôi sẽ cần phải phù hợp với một nhân vật, mỗi lá thư của đó 156 00:08:18,360 --> 00:08:21,330 sẽ đòi hỏi một nhân vật, một byte của bộ nhớ. 157 00:08:21,330 --> 00:08:26,230 Vì vậy, nếu tôi có thể đưa Lloyd vào mảng của tôi như thế này tôi khá tốt để đi, phải không? 158 00:08:26,230 --> 00:08:28,870 Cái gì còn thiếu? 159 00:08:28,870 --> 00:08:31,840 >> Hãy nhớ rằng mỗi chuỗi chúng ta làm việc với trong C kết thúc với dấu gạch chéo ngược bằng không, 160 00:08:31,840 --> 00:08:33,339 và chúng ta không thể bỏ qua ở đây, hoặc. 161 00:08:33,339 --> 00:08:36,090 Chúng tôi cần dành một byte của bộ nhớ để giữ đó vì vậy chúng tôi 162 00:08:36,090 --> 00:08:39,130 biết khi chuỗi của chúng tôi đã kết thúc. 163 00:08:39,130 --> 00:08:41,049 Vì vậy, một lần nữa sắp xếp này các cách thức điều 164 00:08:41,049 --> 00:08:42,799 xuất hiện trong bộ nhớ sức là một chút ngẫu nhiên, 165 00:08:42,799 --> 00:08:44,870 nhưng nó thực sự là như thế nào hầu hết các hệ thống được thiết kế. 166 00:08:44,870 --> 00:08:48,330 Để xếp chúng vào bội bốn, vì những lý do nữa 167 00:08:48,330 --> 00:08:50,080 rằng chúng ta không cần phải nhận được vào ngay bây giờ. 168 00:08:50,080 --> 00:08:53,060 Nhưng điều này, vì vậy nó đủ để nói rằng sau ba dòng mã, 169 00:08:53,060 --> 00:08:54,810 đây là những gì bộ nhớ có thể trông như thế nào. 170 00:08:54,810 --> 00:08:58,930 Nếu tôi cần vị trí bộ nhớ 4, 8, và 12 để giữ dữ liệu của tôi, 171 00:08:58,930 --> 00:09:01,100 đây là những gì bộ nhớ của tôi có thể trông như thế nào. 172 00:09:01,100 --> 00:09:04,062 >> Và chỉ cần được đặc biệt mô phạm ở đây, khi 173 00:09:04,062 --> 00:09:06,020 chúng ta đang nói về bộ nhớ địa chỉ chúng ta thường 174 00:09:06,020 --> 00:09:08,390 làm như vậy bằng cách sử dụng ký hiệu thập lục phân. 175 00:09:08,390 --> 00:09:12,030 Vậy tại sao chúng ta không chuyển đổi tất cả các từ thập phân sang thập lục phân 176 00:09:12,030 --> 00:09:15,010 chỉ vì đó là thường làm thế nào chúng tôi đề cập đến bộ nhớ. 177 00:09:15,010 --> 00:09:17,880 Vì vậy, thay vì thông qua 0 19, những gì chúng tôi có là số không 178 00:09:17,880 --> 00:09:20,340 x zero qua zero x1 ba. 179 00:09:20,340 --> 00:09:23,790 Đó là những 20 byte của bộ nhớ mà chúng tôi đã hoặc chúng tôi đang tìm kiếm ở trong hình ảnh này 180 00:09:23,790 --> 00:09:25,540 ngay tại đây. 181 00:09:25,540 --> 00:09:29,310 >> Vì vậy, tất cả điều đó đang được nói, chúng ta hãy bước ra khỏi bộ nhớ cho một thứ hai 182 00:09:29,310 --> 00:09:30,490 và trở lại con trỏ. 183 00:09:30,490 --> 00:09:32,420 Dưới đây là quan trọng nhất Điều cần nhớ 184 00:09:32,420 --> 00:09:34,070 khi chúng tôi bắt đầu làm việc với con trỏ. 185 00:09:34,070 --> 00:09:36,314 Một con trỏ là gì nhiều hơn một địa chỉ. 186 00:09:36,314 --> 00:09:38,230 Tôi sẽ nói lại một lần nữa bởi vì nó là quan trọng, 187 00:09:38,230 --> 00:09:42,730 một con trỏ là gì nhiều hơn một địa chỉ. 188 00:09:42,730 --> 00:09:47,760 Con trỏ là địa chỉ đến các địa điểm trong bộ nhớ nơi mà các biến sống. 189 00:09:47,760 --> 00:09:52,590 Biết rằng nó sẽ trở thành một hy vọng chút chút dễ dàng hơn để làm việc với họ. 190 00:09:52,590 --> 00:09:54,550 Một điều tôi thích để làm là phải có loại 191 00:09:54,550 --> 00:09:58,510 các biểu đồ trực quan đại diện cho những gì xảy ra với các dòng khác nhau của mã. 192 00:09:58,510 --> 00:10:00,660 Và chúng tôi sẽ làm điều này một vài lần trong con trỏ, 193 00:10:00,660 --> 00:10:03,354 và khi chúng ta nói về năng động cấp phát bộ nhớ là tốt. 194 00:10:03,354 --> 00:10:06,020 Bởi vì tôi nghĩ rằng các sơ đồ có thể đặc biệt hữu ích. 195 00:10:06,020 --> 00:10:09,540 >> Vì vậy, nếu tôi nói ví dụ, int k trong mã của tôi, những gì đang xảy ra? 196 00:10:09,540 --> 00:10:12,524 Vâng những gì đang xảy ra là về cơ bản Tôi nhận được bộ nhớ dành cho tôi, 197 00:10:12,524 --> 00:10:14,690 nhưng tôi thậm chí không thích nghĩ về nó như thế, tôi 198 00:10:14,690 --> 00:10:16,300 thích nghĩ về nó như một chiếc hộp. 199 00:10:16,300 --> 00:10:20,090 Tôi có một hộp và nó màu xanh lá cây vì tôi 200 00:10:20,090 --> 00:10:21,750 có thể đưa các số nguyên trong hộp màu xanh lá cây. 201 00:10:21,750 --> 00:10:23,666 Nếu nó là một nhân vật tôi có thể có một hộp màu xanh. 202 00:10:23,666 --> 00:10:27,290 Nhưng tôi luôn nói, nếu tôi là tạo một hộp có thể giữ nguyên 203 00:10:27,290 --> 00:10:28,950 hộp đó là màu xanh lá cây. 204 00:10:28,950 --> 00:10:33,020 Và tôi có một điểm đánh dấu vĩnh viễn và tôi viết k trên mặt của nó. 205 00:10:33,020 --> 00:10:37,590 Vì vậy, tôi có một hộp gọi là k, vào đó tôi có thể đưa số nguyên. 206 00:10:37,590 --> 00:10:41,070 Vì vậy, khi tôi nói int k, đó là những gì xảy ra trong đầu tôi. 207 00:10:41,070 --> 00:10:43,140 Nếu tôi nói k bằng năm, những gì tôi làm? 208 00:10:43,140 --> 00:10:45,110 Vâng, tôi đang lăm trong hộp, phải. 209 00:10:45,110 --> 00:10:48,670 Điều này là khá dễ dàng, nếu Tôi nói int k, tạo ra một hộp gọi là k. 210 00:10:48,670 --> 00:10:52,040 Nếu tôi nói k bằng 5, đặt năm vào hộp. 211 00:10:52,040 --> 00:10:53,865 Hy vọng rằng đó không phải là quá nhiều của một bước nhảy vọt. 212 00:10:53,865 --> 00:10:55,990 Đây là nơi mà mọi thứ đi một ít thú vị mặc dù. 213 00:10:55,990 --> 00:11:02,590 Nếu tôi nói int * pk, tốt ngay cả nếu tôi không làm biết điều này nhất thiết có nghĩa là, 214 00:11:02,590 --> 00:11:06,150 nó có một cái gì đó rõ ràng để làm với một số nguyên. 215 00:11:06,150 --> 00:11:08,211 Vì vậy, tôi sẽ tô màu hộp này màu xanh lá cây-ish, 216 00:11:08,211 --> 00:11:10,210 Tôi biết nó có một cái gì đó để làm với một số nguyên, 217 00:11:10,210 --> 00:11:13,400 nhưng nó không phải là một số nguyên chính nó, bởi vì nó là một ngôi sao int. 218 00:11:13,400 --> 00:11:15,390 Có cái gì đó hơi khác nhau về nó. 219 00:11:15,390 --> 00:11:17,620 Vì vậy, tham gia của một số nguyên, nhưng nếu không nó 220 00:11:17,620 --> 00:11:19,830 không quá khác nhau từ những gì chúng ta đang nói về. 221 00:11:19,830 --> 00:11:24,240 Đó là một hộp, nhận nó một nhãn, nó mặc một pk nhãn, 222 00:11:24,240 --> 00:11:27,280 và nó có khả năng nắm giữ int sao, bất cứ điều gì người đang có. 223 00:11:27,280 --> 00:11:29,894 Họ có cái gì để làm với số nguyên, rõ ràng. 224 00:11:29,894 --> 00:11:31,060 Dưới đây là những dòng cuối cùng dù. 225 00:11:31,060 --> 00:11:37,650 Nếu tôi nói pk = & k, whoa, những gì vừa xảy ra, phải không? 226 00:11:37,650 --> 00:11:41,820 Vì vậy, số ngẫu nhiên này, dường như ngẫu nhiên số, được ném vào hộp đó. 227 00:11:41,820 --> 00:11:44,930 Tất cả đó là, là pk được địa chỉ của k. 228 00:11:44,930 --> 00:11:52,867 Vì vậy, tôi gắn bó với k sống trong bộ nhớ, địa chỉ, địa chỉ của byte của nó. 229 00:11:52,867 --> 00:11:55,200 Tất cả tôi đang làm là tôi đang nói giá trị đó là những gì tôi sẽ 230 00:11:55,200 --> 00:11:59,430 để đặt bên trong của hộp được gọi là pk của tôi. 231 00:11:59,430 --> 00:12:02,080 Và bởi vì những điều này là con trỏ, và bởi vì tìm kiếm 232 00:12:02,080 --> 00:12:04,955 tại một chuỗi như zero x tám zero c bảy bốn tám 233 00:12:04,955 --> 00:12:07,790 hai số không có lẽ không rất có ý nghĩa. 234 00:12:07,790 --> 00:12:12,390 Khi chúng ta thường hình dung con trỏ, chúng tôi thực sự làm như vậy là con trỏ. 235 00:12:12,390 --> 00:12:17,000 Pk cung cấp cho chúng tôi thông tin chúng ta cần phải tìm k trong bộ nhớ. 236 00:12:17,000 --> 00:12:19,120 Vì vậy, về cơ bản pk có một mũi tên trong đó. 237 00:12:19,120 --> 00:12:21,670 Và nếu chúng ta đi theo chiều dài các mũi tên đó, hãy tưởng tượng 238 00:12:21,670 --> 00:12:25,280 nó là một cái gì đó bạn có thể đi bộ trên, nếu chúng ta đi bộ dọc theo chiều dài của mũi tên, 239 00:12:25,280 --> 00:12:29,490 ở đầu rất của mũi tên đó, chúng tôi sẽ tìm được vị trí trong bộ nhớ 240 00:12:29,490 --> 00:12:31,390 nơi k sống. 241 00:12:31,390 --> 00:12:34,360 Và đó thực sự quan trọng bởi vì một khi chúng ta biết nơi k sống, 242 00:12:34,360 --> 00:12:37,870 chúng ta có thể bắt đầu làm việc với các dữ liệu bên của vị trí bộ nhớ. 243 00:12:37,870 --> 00:12:40,780 Mặc dù chúng tôi đang nhận được một teeny cắn trước mình cho bây giờ. 244 00:12:40,780 --> 00:12:42,240 >> Vì vậy, một con trỏ là gì? 245 00:12:42,240 --> 00:12:45,590 Một con trỏ là một mục dữ liệu mà giá trị là một địa chỉ bộ nhớ. 246 00:12:45,590 --> 00:12:49,740 Đó là zero x tám zero thứ xảy ra, đó là một địa chỉ bộ nhớ. 247 00:12:49,740 --> 00:12:52,060 Đó là một vị trí trong bộ nhớ. 248 00:12:52,060 --> 00:12:55,080 Và các loại của một con trỏ mô tả các loại 249 00:12:55,080 --> 00:12:56,930 dữ liệu mà bạn sẽ tìm thấy tại địa chỉ bộ nhớ. 250 00:12:56,930 --> 00:12:58,810 Vì vậy, có những int sao phần bên phải. 251 00:12:58,810 --> 00:13:03,690 Nếu tôi làm theo mũi tên đó, nó sẽ dẫn tôi đến một địa điểm. 252 00:13:03,690 --> 00:13:06,980 Và vị trí đó, những gì tôi sẽ tìm thấy ở đó trong ví dụ của tôi, 253 00:13:06,980 --> 00:13:08,240 là một hộp màu xanh lá cây. 254 00:13:08,240 --> 00:13:12,650 Đó là một số nguyên, đó là những gì tôi sẽ tìm thấy nếu tôi đi đến địa chỉ đó. 255 00:13:12,650 --> 00:13:14,830 Các kiểu dữ liệu của một con trỏ mô tả những gì 256 00:13:14,830 --> 00:13:17,936 bạn sẽ tìm thấy tại địa chỉ bộ nhớ. 257 00:13:17,936 --> 00:13:19,560 Vì vậy, đây là điều thực sự mát mẻ mặc dù. 258 00:13:19,560 --> 00:13:25,090 Con trỏ cho phép chúng ta vượt qua biến giữa các chức năng. 259 00:13:25,090 --> 00:13:28,520 Và thực sự vượt qua các biến và không vượt qua bản của chúng. 260 00:13:28,520 --> 00:13:32,879 Bởi vì nếu chúng ta biết chính xác nơi trong bộ nhớ để tìm một biến, 261 00:13:32,879 --> 00:13:35,670 chúng ta không cần phải thực hiện một bản sao của nó, chúng ta chỉ có thể đi đến vị trí đó 262 00:13:35,670 --> 00:13:37,844 và làm việc với các biến đó. 263 00:13:37,844 --> 00:13:40,260 Vì vậy, trong bản chất con trỏ loại của làm cho một môi trường máy tính 264 00:13:40,260 --> 00:13:42,360 nhiều hơn như thế giới thực, phải. 265 00:13:42,360 --> 00:13:44,640 >> Vì vậy, đây là một tương tự. 266 00:13:44,640 --> 00:13:48,080 Hãy nói rằng tôi có một máy tính xách tay, phải, và nó đầy đủ các ghi chú. 267 00:13:48,080 --> 00:13:50,230 Và tôi sẽ như bạn để cập nhật nó. 268 00:13:50,230 --> 00:13:53,960 Bạn là một chức năng mà cập nhật ghi chú, phải. 269 00:13:53,960 --> 00:13:56,390 Trên đường đi, chúng tôi đã làm việc cho đến nay, những gì 270 00:13:56,390 --> 00:14:02,370 xảy ra là bạn sẽ mất máy tính xách tay của tôi, bạn sẽ đi đến các cửa hàng sao chép, 271 00:14:02,370 --> 00:14:06,410 bạn sẽ tạo một bản sao của Xerox mỗi trang của các máy tính xách tay. 272 00:14:06,410 --> 00:14:09,790 Bạn sẽ rời khỏi máy tính xách tay của tôi trở lại trên bàn của tôi khi bạn đang thực hiện, 273 00:14:09,790 --> 00:14:14,600 bạn sẽ đi và gạch bỏ những thứ trong tôi máy tính xách tay mà là lỗi thời hoặc sai, 274 00:14:14,600 --> 00:14:19,280 và sau đó bạn sẽ vượt qua trở lại tôi ngăn xếp của các trang Xerox 275 00:14:19,280 --> 00:14:22,850 đó là một bản sao của máy tính xách tay của tôi với những thay đổi mà bạn đã thực hiện cho nó. 276 00:14:22,850 --> 00:14:27,040 Và tại thời điểm đó, nó thuộc vào tôi như chức năng gọi điện thoại, như người gọi, 277 00:14:27,040 --> 00:14:30,582 quyết định để ghi chép lại và tích hợp chúng lại thành máy tính xách tay của tôi. 278 00:14:30,582 --> 00:14:32,540 Vì vậy, có rất nhiều bước liên quan ở đây, phải. 279 00:14:32,540 --> 00:14:34,850 Như thế sẽ không thể tốt hơn nếu tôi chỉ nói, hey, có thể bạn 280 00:14:34,850 --> 00:14:38,370 cập nhật máy tính xách tay của tôi cho tôi, đưa cho bạn máy tính xách tay của tôi, 281 00:14:38,370 --> 00:14:40,440 và bạn có những điều và nghĩa là vượt qua chúng ra 282 00:14:40,440 --> 00:14:42,810 và cập nhật ghi chú của tôi trong máy tính xách tay của tôi. 283 00:14:42,810 --> 00:14:45,140 Và sau đó đưa cho tôi máy tính xách tay của tôi trở lại. 284 00:14:45,140 --> 00:14:47,320 Đó là loại gì con trỏ cho phép chúng ta làm, 285 00:14:47,320 --> 00:14:51,320 họ làm cho môi trường này rất nhiều giống như cách chúng tôi hoạt động trong thực tế. 286 00:14:51,320 --> 00:14:54,640 >> Tất cả các quyền đó là những gì một con trỏ, chúng ta hãy nói 287 00:14:54,640 --> 00:14:58,040 khoảng cách con trỏ làm việc trong C, và làm thế nào chúng ta có thể bắt đầu làm việc với họ. 288 00:14:58,040 --> 00:15:02,550 Vì vậy, có một con trỏ rất đơn giản trong C gọi là con trỏ null. 289 00:15:02,550 --> 00:15:04,830 Các điểm con trỏ null không có gì. 290 00:15:04,830 --> 00:15:08,310 Điều này có thể có vẻ như nó là thực sự không phải là một điều rất hữu ích, 291 00:15:08,310 --> 00:15:10,500 nhưng như chúng ta sẽ thấy một chút sau này, thực tế 292 00:15:10,500 --> 00:15:15,410 rằng con trỏ null này tồn tại thực sự có thể thực sự có ích. 293 00:15:15,410 --> 00:15:19,090 Và bất cứ khi nào bạn tạo ra một con trỏ, và bạn không đặt immediately- giá trị của nó 294 00:15:19,090 --> 00:15:21,060 một ví dụ về thiết lập giá trị của nó ngay lập tức 295 00:15:21,060 --> 00:15:25,401 sẽ có một vài slide lại mà tôi đã nói pk bằng & k, 296 00:15:25,401 --> 00:15:28,740 pk được địa chỉ k, như chúng ta sẽ thấy điều đó có nghĩa, 297 00:15:28,740 --> 00:15:32,990 chúng tôi sẽ xem làm thế nào để mã đó shortly- nếu chúng ta không đặt giá trị là một cái gì đó 298 00:15:32,990 --> 00:15:35,380 có ý nghĩa ngay lập tức, bạn nên luôn luôn 299 00:15:35,380 --> 00:15:37,480 đặt con trỏ của bạn để trỏ đến null. 300 00:15:37,480 --> 00:15:40,260 Bạn nên thiết lập nó để trỏ đến không có gì. 301 00:15:40,260 --> 00:15:43,614 >> Đó là rất khác so với chỉ để lại những giá trị như nó là 302 00:15:43,614 --> 00:15:45,530 và sau đó tuyên bố một con trỏ và chỉ là giả định 303 00:15:45,530 --> 00:15:48,042 nó là null bởi vì đó là hiếm khi thực sự. 304 00:15:48,042 --> 00:15:50,000 Vì vậy, bạn nên luôn luôn đặt giá trị của một con trỏ 305 00:15:50,000 --> 00:15:55,690 để null nếu bạn không đặt giá trị của nó một cái gì đó có ý nghĩa ngay lập tức. 306 00:15:55,690 --> 00:15:59,090 Bạn có thể kiểm tra xem giá trị của một con trỏ là null bằng cách sử dụng toán tử bằng 307 00:15:59,090 --> 00:16:05,450 (==), Giống như bạn so sánh bất kỳ số nguyên giá trị hoặc giá trị ký tự sử dụng (==) 308 00:16:05,450 --> 00:16:06,320 cũng. 309 00:16:06,320 --> 00:16:10,994 Đó là một loại đặc biệt của hằng số giá trị mà bạn có thể sử dụng để kiểm tra. 310 00:16:10,994 --> 00:16:13,160 Vì vậy, đó là một rất đơn giản con trỏ, con trỏ null. 311 00:16:13,160 --> 00:16:15,320 Một cách khác để tạo một con trỏ là để trích xuất 312 00:16:15,320 --> 00:16:18,240 địa chỉ của một biến bạn đã tạo ra, 313 00:16:18,240 --> 00:16:22,330 và bạn làm điều này bằng cách sử dụng & khai thác địa chỉ nhà điều hành. 314 00:16:22,330 --> 00:16:26,720 Mà chúng ta đã thấy trước đây trong sơ đồ ví dụ đầu tiên tôi thấy. 315 00:16:26,720 --> 00:16:31,450 Vì vậy, nếu x là một biến mà chúng tôi đã đã tạo ra các kiểu số nguyên, 316 00:16:31,450 --> 00:16:35,110 sau đó & x là một con trỏ đến một số nguyên. 317 00:16:35,110 --> 00:16:39,810 & x là- nhớ, và sẽ tách địa chỉ của những điều trên bên phải. 318 00:16:39,810 --> 00:16:45,350 Và từ một con trỏ chỉ là một địa chỉ, hơn & x là một con trỏ đến một số nguyên 319 00:16:45,350 --> 00:16:48,560 giá trị mà là nơi mà trong bộ nhớ x cuộc sống. 320 00:16:48,560 --> 00:16:50,460 Đó là địa chỉ của x. 321 00:16:50,460 --> 00:16:53,296 Vì vậy, & x là địa chỉ của x. 322 00:16:53,296 --> 00:16:55,670 Hãy lấy một bước xa hơn và kết nối với một cái gì đó 323 00:16:55,670 --> 00:16:58,380 Tôi ám chỉ trong một video trước. 324 00:16:58,380 --> 00:17:06,730 Nếu arr là một mảng tăng gấp đôi, sau đó & khung vuông arr tôi là một con trỏ 325 00:17:06,730 --> 00:17:08,109 để một đôi. 326 00:17:08,109 --> 00:17:08,970 ĐƯỢC. 327 00:17:08,970 --> 00:17:12,160 arr khung vuông i, nếu arr là một mảng tăng gấp đôi, 328 00:17:12,160 --> 00:17:19,069 sau đó arr khung vuông i là các phần tử thứ i của mảng đó, 329 00:17:19,069 --> 00:17:29,270 và & arr khung vuông i là nơi ở bộ nhớ các phần tử thứ i của arr tồn tại. 330 00:17:29,270 --> 00:17:31,790 >> Vì vậy, hàm ý ở đây là gì? 331 00:17:31,790 --> 00:17:34,570 Một tên mảng, hàm ý của toàn bộ điều này, 332 00:17:34,570 --> 00:17:39,290 là tên của một mảng là thực sự chính nó là một con trỏ. 333 00:17:39,290 --> 00:17:41,170 Bạn đã làm việc với con trỏ tất cả cùng 334 00:17:41,170 --> 00:17:45,290 mỗi thời gian mà bạn đã sử dụng một mảng. 335 00:17:45,290 --> 00:17:49,090 Ghi từ các ví dụ trên phạm vi biến, 336 00:17:49,090 --> 00:17:53,420 gần cuối của đoạn video, tôi trình bày một ví dụ mà chúng ta có một chức năng 337 00:17:53,420 --> 00:17:56,890 gọi là bộ int và một chức năng gọi là mảng tập. 338 00:17:56,890 --> 00:18:00,490 Và thách thức của bạn để xác định hay không, hoặc những gì 339 00:18:00,490 --> 00:18:03,220 giá trị mà chúng tôi in ra kết thúc chức năng, 340 00:18:03,220 --> 00:18:05,960 ở phần cuối của chương trình chính. 341 00:18:05,960 --> 00:18:08,740 >> Nếu bạn nhớ lại từ ví dụ mà hoặc nếu bạn đã xem video, 342 00:18:08,740 --> 00:18:13,080 Bạn có biết rằng khi anh- cuộc gọi đến set int hiệu quả không có gì. 343 00:18:13,080 --> 00:18:16,390 Nhưng các cuộc gọi để thiết lập mảng nào. 344 00:18:16,390 --> 00:18:19,280 Và tôi loại che đậy lý do tại sao đó là trường hợp vào thời điểm đó. 345 00:18:19,280 --> 00:18:22,363 Tôi chỉ nói, tốt nó một mảng, nó đặc biệt, bạn đã biết, có một lý do. 346 00:18:22,363 --> 00:18:25,020 Lý do là một mảng của tên thực sự chỉ là một con trỏ, 347 00:18:25,020 --> 00:18:28,740 và có này đặc biệt cú pháp khung vuông đó 348 00:18:28,740 --> 00:18:30,510 làm cho mọi việc rất nhiều đẹp hơn để làm việc với. 349 00:18:30,510 --> 00:18:34,410 Và họ làm cho các ý tưởng của một con trỏ ít hơn rất nhiều đáng sợ, 350 00:18:34,410 --> 00:18:36,800 và đó là lý do tại sao họ loại của giới theo cách đó. 351 00:18:36,800 --> 00:18:38,600 Nhưng thực sự là mảng chỉ con trỏ. 352 00:18:38,600 --> 00:18:41,580 Và đó là lý do tại sao khi chúng ta thực hiện một sự thay đổi để mảng, 353 00:18:41,580 --> 00:18:44,880 khi chúng tôi đi qua một mảng như là một tham số đến một chức năng hay như một đối số 354 00:18:44,880 --> 00:18:50,110 đến một chức năng, nội dung của mảng thực sự thay đổi trong cả callee 355 00:18:50,110 --> 00:18:51,160 và trong những người gọi. 356 00:18:51,160 --> 00:18:55,846 Mà cho tất cả các loại khác biến chúng tôi thấy là không phải vậy. 357 00:18:55,846 --> 00:18:58,970 Vì vậy, đó chỉ là một cái gì đó để giữ trong tâm trí khi bạn đang làm việc với con trỏ, 358 00:18:58,970 --> 00:19:01,610 là tên của một mảng thực sự là một con trỏ 359 00:19:01,610 --> 00:19:04,750 tới phần tử đầu tiên của mảng đó. 360 00:19:04,750 --> 00:19:08,930 >> OK như vậy bây giờ chúng tôi có tất cả những sự thật, chúng ta hãy tiếp tục đi, phải. 361 00:19:08,930 --> 00:19:11,370 Tại sao chúng ta quan tâm nơi một cái gì đó sống. 362 00:19:11,370 --> 00:19:14,120 Cũng như tôi đã nói, nó khá hữu ích để biết rằng điều gì sống 363 00:19:14,120 --> 00:19:17,240 vì vậy bạn có thể đến đó và thay đổi nó. 364 00:19:17,240 --> 00:19:19,390 Làm việc với nó và thực sự có những điều mà bạn 365 00:19:19,390 --> 00:19:23,710 muốn làm gì để điều đó ảnh hưởng take biến, và không có hiệu lực trên một số bản sao của nó. 366 00:19:23,710 --> 00:19:26,150 Điều này được gọi là dereferencing. 367 00:19:26,150 --> 00:19:28,690 Chúng tôi đi đến các tài liệu tham khảo và chúng ta thay đổi giá trị ở đó. 368 00:19:28,690 --> 00:19:32,660 Vì vậy, nếu chúng ta có một con trỏ và nó được gọi là pc, và nó chỉ vào một nhân vật, 369 00:19:32,660 --> 00:19:40,610 sau đó chúng ta có thể nói * pc và * pc là tên của những gì chúng ta sẽ tìm thấy nếu chúng ta đi 370 00:19:40,610 --> 00:19:42,910 cho pc địa chỉ. 371 00:19:42,910 --> 00:19:47,860 Một nhân vật mà chúng ta sẽ tìm thấy ở đó là và * pc là cách chúng tôi tham khảo các dữ liệu ở đó 372 00:19:47,860 --> 00:19:48,880 vị trí. 373 00:19:48,880 --> 00:19:54,150 Vì vậy, chúng ta có thể nói điều gì đó như * pc = D hoặc một cái gì đó như thế, 374 00:19:54,150 --> 00:19:59,280 và điều đó có nghĩa rằng bất cứ điều gì là tại địa chỉ bộ nhớ máy tính, 375 00:19:59,280 --> 00:20:07,040 bất kỳ nhân vật trước đây đó, bây giờ là D, nếu chúng ta nói * pc = D. 376 00:20:07,040 --> 00:20:10,090 >> Vì vậy, ở đây chúng tôi đi một lần nữa với một số công cụ C lạ, phải. 377 00:20:10,090 --> 00:20:14,560 Vì vậy, chúng tôi đã nhìn thấy * trước đây như là bằng cách nào đó một phần của các kiểu dữ liệu, 378 00:20:14,560 --> 00:20:17,160 và bây giờ nó đang được sử dụng trong một bối cảnh hơi khác nhau 379 00:20:17,160 --> 00:20:19,605 để truy cập vào dữ liệu tại một địa điểm. 380 00:20:19,605 --> 00:20:22,480 Tôi biết đó là một chút bối rối và đó là thực sự là một phần của toàn bộ này 381 00:20:22,480 --> 00:20:25,740 như thế, tại sao con trỏ có thần thoại này xung quanh họ như là quá phức tạp, 382 00:20:25,740 --> 00:20:28,250 là loại một vấn đề cú pháp, trung thực. 383 00:20:28,250 --> 00:20:31,810 Nhưng * được sử dụng trong cả hai trường hợp, cả hai như là một phần của tên loại, 384 00:20:31,810 --> 00:20:34,100 và chúng ta sẽ thấy một chút sau đó một cái gì đó khác nữa. 385 00:20:34,100 --> 00:20:36,490 Và ngay bây giờ là toán tử tham chiếu. 386 00:20:36,490 --> 00:20:38,760 Vì vậy, nó đi vào các tài liệu tham khảo, nó truy cập vào dữ liệu 387 00:20:38,760 --> 00:20:43,000 tại vị trí của con trỏ, và cho phép bạn thao tác nó theo ý thích. 388 00:20:43,000 --> 00:20:45,900 >> Bây giờ điều này là rất tương tự như thăm người hàng xóm của bạn, phải. 389 00:20:45,900 --> 00:20:48,710 Nếu bạn biết những gì bạn người hàng xóm sống, bạn 390 00:20:48,710 --> 00:20:50,730 không đi chơi với người hàng xóm của bạn. 391 00:20:50,730 --> 00:20:53,510 Bạn biết bạn tình cờ biết nơi họ sinh sống, 392 00:20:53,510 --> 00:20:56,870 nhưng điều đó không có nghĩa là bởi nhờ có kiến ​​thức mà 393 00:20:56,870 --> 00:20:59,170 bạn đang tương tác với họ. 394 00:20:59,170 --> 00:21:01,920 Nếu bạn muốn tương tác với họ, bạn phải đi đến nhà của họ, 395 00:21:01,920 --> 00:21:03,760 bạn phải đi đến nơi họ sinh sống. 396 00:21:03,760 --> 00:21:07,440 Và một khi bạn làm điều đó, sau đó bạn có thể tương tác 397 00:21:07,440 --> 00:21:09,420 với họ chỉ thích bạn muốn. 398 00:21:09,420 --> 00:21:12,730 Và tương tự như vậy với các biến, bạn cần phải đi đến địa chỉ của họ 399 00:21:12,730 --> 00:21:15,320 nếu bạn muốn tương tác cho họ, bạn không thể chỉ biết địa chỉ. 400 00:21:15,320 --> 00:21:21,495 Và cách bạn đi đến địa chỉ là sử dụng *, các toán tử tham chiếu. 401 00:21:21,495 --> 00:21:23,620 Bạn nghĩ gì sẽ xảy ra nếu chúng ta cố gắng và tới đích 402 00:21:23,620 --> 00:21:25,260 một con trỏ có giá trị là null? 403 00:21:25,260 --> 00:21:28,470 Nhớ lại rằng null con trỏ trỏ tới không có gì. 404 00:21:28,470 --> 00:21:34,110 Vì vậy, nếu bạn cố gắng và tới đích không có gì hoặc đi đến một địa chỉ không có gì, 405 00:21:34,110 --> 00:21:36,800 Bạn nghĩ gì sẽ xảy ra? 406 00:21:36,800 --> 00:21:39,630 Phân khúc Vâng, nếu bạn đoán lỗi, bạn muốn được quyền. 407 00:21:39,630 --> 00:21:41,390 Nếu bạn cố gắng và tới đích một con trỏ null, 408 00:21:41,390 --> 00:21:43,140 bạn phải chịu một phân khúc lỗi. Nhưng chờ đợi, 409 00:21:43,140 --> 00:21:45,820 tôi không nói với bạn rằng nếu bạn không đi 410 00:21:45,820 --> 00:21:49,220 để thiết lập giá trị của bạn của bạn con trỏ đến một cái gì đó có ý nghĩa, 411 00:21:49,220 --> 00:21:51,000 bạn nên đặt là null? 412 00:21:51,000 --> 00:21:55,290 Tôi đã làm và thực sự các phân khúc lỗi là một loại hành vi tốt. 413 00:21:55,290 --> 00:21:58,680 >> Bạn có bao giờ tuyên bố một biến và không được chỉ định giá trị của nó ngay lập tức? 414 00:21:58,680 --> 00:22:02,680 Vì vậy, bạn chỉ cần nói int x; bạn làm không thực sự gán nó vào bất cứ điều gì 415 00:22:02,680 --> 00:22:05,340 và sau đó vào trong mã của bạn, bạn in ra các giá trị của x, 416 00:22:05,340 --> 00:22:07,650 có vẫn không giao nó cho bất cứ điều gì. 417 00:22:07,650 --> 00:22:10,370 Thường xuyên, bạn sẽ nhận được bằng không, nhưng đôi khi bạn 418 00:22:10,370 --> 00:22:15,000 có thể nhận được một số số ngẫu nhiên, và bạn không có ý tưởng đó đến từ đâu. 419 00:22:15,000 --> 00:22:16,750 Tương tự như vậy có thể điều xảy ra với con trỏ. 420 00:22:16,750 --> 00:22:20,110 Khi bạn khai báo một con trỏ int * pk ví dụ, 421 00:22:20,110 --> 00:22:23,490 và bạn không gán cho nó một giá trị, bạn nhận được bốn byte cho bộ nhớ. 422 00:22:23,490 --> 00:22:25,950 Dù bốn byte của bộ nhớ hệ thống có thể 423 00:22:25,950 --> 00:22:28,970 thấy rằng có một số giá trị có ý nghĩa. 424 00:22:28,970 --> 00:22:31,760 Và có thể có được cái gì đã có mà 425 00:22:31,760 --> 00:22:34,190 là không còn cần thiết khác chức năng, vì vậy bạn chỉ có 426 00:22:34,190 --> 00:22:35,900 bất cứ dữ liệu đã có. 427 00:22:35,900 --> 00:22:40,570 >> Điều gì nếu bạn cố gắng làm tới đích một số địa chỉ mà bạn không- có 428 00:22:40,570 --> 00:22:43,410 đã byte và thông tin trong có, đó là bây giờ trong con trỏ của bạn. 429 00:22:43,410 --> 00:22:47,470 Nếu bạn cố gắng và tới đích của con trỏ, bạn có thể bị rối tung với một số bộ nhớ 430 00:22:47,470 --> 00:22:49,390 rằng bạn không có ý định gây rối với nó tất cả. 431 00:22:49,390 --> 00:22:51,639 Và trong thực tế, bạn có thể làm một cái gì đó thực sự tàn phá, 432 00:22:51,639 --> 00:22:54,880 như phá vỡ một chương trình khác, hoặc phá vỡ chức năng khác, 433 00:22:54,880 --> 00:22:58,289 hoặc làm điều gì đó độc hại bạn không có ý định làm ở tất cả. 434 00:22:58,289 --> 00:23:00,080 Và đó là lý do tại sao nó thực sự là một ý tưởng tốt 435 00:23:00,080 --> 00:23:04,030 để đặt con trỏ của bạn để null nếu bạn không đặt chúng vào một cái gì đó có ý nghĩa. 436 00:23:04,030 --> 00:23:06,760 Đây có thể là tốt hơn ở cuối ngày cho chương trình của bạn 437 00:23:06,760 --> 00:23:09,840 sụp đổ sau đó cho nó để làm một cái gì đó mà vít lên 438 00:23:09,840 --> 00:23:12,400 một chương trình hoặc chức năng khác. 439 00:23:12,400 --> 00:23:15,207 Hành vi đó có lẽ thậm chí ít lý tưởng hơn là chỉ đâm. 440 00:23:15,207 --> 00:23:17,040 Và đó là lý do tại sao nó thực sự là một thói quen tốt 441 00:23:17,040 --> 00:23:20,920 để có được vào để thiết lập con trỏ của bạn để null nếu bạn không đặt chúng 442 00:23:20,920 --> 00:23:24,540 đến một giá trị có ý nghĩa ngay lập tức, một giá trị mà bạn biết 443 00:23:24,540 --> 00:23:27,260 và rằng bạn có thể một cách an toàn tới đích. 444 00:23:27,260 --> 00:23:32,240 >> Vì vậy, chúng ta hãy quay lại bây giờ và có một cái nhìn vào cú pháp tổng thể về tình hình. 445 00:23:32,240 --> 00:23:37,400 Nếu tôi nói int * p ;, những gì đã tôi chỉ thực hiện? 446 00:23:37,400 --> 00:23:38,530 Những gì tôi đã làm điều này là. 447 00:23:38,530 --> 00:23:43,290 Tôi biết giá trị của p là một địa chỉ bởi vì tất cả các con trỏ chỉ 448 00:23:43,290 --> 00:23:44,660 địa chỉ. 449 00:23:44,660 --> 00:23:47,750 Tôi có thể tới đích của p sử dụng các nhà điều hành *. 450 00:23:47,750 --> 00:23:51,250 Trong bối cảnh này ở đây, ở rất đầu nhớ lại * là một phần của các loại. 451 00:23:51,250 --> 00:23:53,510 Int * là các kiểu dữ liệu. 452 00:23:53,510 --> 00:23:56,150 Nhưng tôi có thể tới đích p sử dụng nhà điều hành *, 453 00:23:56,150 --> 00:24:01,897 và nếu tôi làm như vậy, nếu tôi đi đến địa chỉ đó, những gì tôi sẽ tìm thấy tại địa chỉ đó? 454 00:24:01,897 --> 00:24:02,855 Tôi sẽ tìm một số nguyên. 455 00:24:02,855 --> 00:24:05,910 Vì vậy, int * p về cơ bản là nói, p là một địa chỉ. 456 00:24:05,910 --> 00:24:09,500 Tôi có thể tới đích của p và nếu Tôi làm, tôi sẽ tìm thấy một số nguyên 457 00:24:09,500 --> 00:24:11,920 ở vị trí bộ nhớ. 458 00:24:11,920 --> 00:24:14,260 >> OK vì vậy tôi biết có một người khác Điều khó chịu với các ngôi sao 459 00:24:14,260 --> 00:24:17,060 và đây là nơi mà Điều khó chịu với các ngôi sao là. 460 00:24:17,060 --> 00:24:21,640 Bạn đã bao giờ cố gắng để khai báo nhiều biến cùng loại 461 00:24:21,640 --> 00:24:24,409 trên cùng một dòng mã? 462 00:24:24,409 --> 00:24:27,700 Vì vậy, cho một thứ hai, giả vờ rằng các dòng, mã tôi thực sự có có màu xanh lá cây 463 00:24:27,700 --> 00:24:29,366 là không có và nó chỉ nói int x, y, z ;. 464 00:24:29,366 --> 00:24:31,634 465 00:24:31,634 --> 00:24:34,550 Gì mà có thể làm thực sự tạo ra là ba biến số nguyên cho bạn, 466 00:24:34,550 --> 00:24:36,930 một gọi là x, một gọi là y, và một gọi là z. 467 00:24:36,930 --> 00:24:41,510 Đó là một cách để làm điều đó mà không cần phải chia vào ba dòng. 468 00:24:41,510 --> 00:24:43,890 >> Đây là nơi những ngôi sao có được gây phiền nhiễu một lần nữa mặc dù, 469 00:24:43,890 --> 00:24:49,200 vì * thực sự là một phần của cả hai loại tên và một phần 470 00:24:49,200 --> 00:24:50,320 của tên biến. 471 00:24:50,320 --> 00:24:56,430 Và như vậy, nếu tôi nói int * px, py, pz, những gì tôi thực sự có được là một con trỏ đến một số nguyên 472 00:24:56,430 --> 00:25:01,650 gọi là px và hai số nguyên, py và pz. 473 00:25:01,650 --> 00:25:04,950 Và có lẽ đó không phải những gì chúng ta muốn, đó là không tốt. 474 00:25:04,950 --> 00:25:09,290 >> Vì vậy, nếu tôi muốn tạo ra nhiều con trỏ trên cùng một dòng, cùng loại, 475 00:25:09,290 --> 00:25:12,140 và các ngôi sao, những gì tôi thực sự cần làm là nói int * pa, pb *, * pc. 476 00:25:12,140 --> 00:25:17,330 477 00:25:17,330 --> 00:25:20,300 Bây giờ đã chỉ cho biết rằng và bây giờ nói với bạn điều này, 478 00:25:20,300 --> 00:25:22,170 có thể bạn sẽ không bao giờ làm điều này. 479 00:25:22,170 --> 00:25:25,170 Và nó có thể là một điều tốt một cách trung thực, vì có lẽ bạn vô tình 480 00:25:25,170 --> 00:25:26,544 bỏ qua một ngôi sao, một cái gì đó như thế. 481 00:25:26,544 --> 00:25:29,290 Đây có thể là tốt nhất để có thể khai báo con trỏ trên từng đường nét, 482 00:25:29,290 --> 00:25:31,373 nhưng nó chỉ là một số khác của những cú pháp gây phiền nhiễu 483 00:25:31,373 --> 00:25:35,310 điều với các ngôi sao mà làm con trỏ rất khó khăn để làm việc với. 484 00:25:35,310 --> 00:25:39,480 Bởi vì nó chỉ là cú pháp này mess bạn phải làm việc thông qua. 485 00:25:39,480 --> 00:25:41,600 Với thực tế nó không thực sự trở thành bản chất thứ hai. 486 00:25:41,600 --> 00:25:45,410 Tôi vẫn có những sai sót với nó vẫn sau khi lập trình trong 10 năm, 487 00:25:45,410 --> 00:25:49,630 vì vậy đừng buồn nếu một cái gì đó xảy ra cho bạn, nó khá phổ biến một cách trung thực. 488 00:25:49,630 --> 00:25:52,850 Nó thực sự loại một lỗ hổng của cú pháp. 489 00:25:52,850 --> 00:25:54,900 >> OK vì vậy tôi loại hứa rằng chúng tôi sẽ xem xét lại 490 00:25:54,900 --> 00:25:59,370 các khái niệm lớn như thế nào là một chuỗi. 491 00:25:59,370 --> 00:26:02,750 Vâng, nếu tôi nói với bạn rằng một chuỗi, chúng tôi đã thực sự loại 492 00:26:02,750 --> 00:26:04,140 được nói dối bạn toàn bộ thời gian. 493 00:26:04,140 --> 00:26:06,181 Không có loại dữ liệu được gọi là chuỗi, và trong thực tế, tôi 494 00:26:06,181 --> 00:26:09,730 đề cập đến điều này trong một của chúng tôi video sớm nhất về các kiểu dữ liệu, 495 00:26:09,730 --> 00:26:13,820 chuỗi đó là một kiểu dữ liệu mà đã được tạo ra cho bạn trong CS50.h. 496 00:26:13,820 --> 00:26:17,050 Bạn phải #include CS50.h để sử dụng nó. 497 00:26:17,050 --> 00:26:19,250 >> Vâng chuỗi thực sự là chỉ một bí danh cho một cái gì đó 498 00:26:19,250 --> 00:26:23,600 gọi là char *, a con trỏ đến một nhân vật. 499 00:26:23,600 --> 00:26:26,010 Vâng con trỏ, thu hồi, chỉ là địa chỉ. 500 00:26:26,010 --> 00:26:28,780 Vì vậy, kích thước là gì trong byte của một chuỗi? 501 00:26:28,780 --> 00:26:29,796 Vâng đó là bốn hoặc tám. 502 00:26:29,796 --> 00:26:32,170 Và lý do tôi nói bốn hoặc tám là bởi vì nó thực sự 503 00:26:32,170 --> 00:26:36,730 phụ thuộc vào hệ thống, nếu bạn đang sử dụng CS50 ide, char * là kích thước của một char 504 00:26:36,730 --> 00:26:39,340 * Là tám, nó là một hệ thống 64-bit. 505 00:26:39,340 --> 00:26:43,850 Mỗi địa chỉ trong bộ nhớ dài 64 bit. 506 00:26:43,850 --> 00:26:48,270 Nếu bạn đang sử dụng thiết bị CS50 hoặc sử dụng bất kỳ máy tính 32-bit, 507 00:26:48,270 --> 00:26:51,640 và bạn đã nghe nói rằng thời hạn 32-bit máy, một máy 32-bit là gì? 508 00:26:51,640 --> 00:26:56,090 Vâng nó chỉ có nghĩa rằng mỗi địa chỉ trong bộ nhớ dài 32 bit. 509 00:26:56,090 --> 00:26:59,140 Và nên 32 bit là bốn byte. 510 00:26:59,140 --> 00:27:02,710 Vì vậy, một char * là bốn hoặc tám byte tùy thuộc vào hệ thống của bạn. 511 00:27:02,710 --> 00:27:06,100 Và thực sự bất kỳ loại dữ liệu, và một con trỏ đến bất kỳ dữ liệu 512 00:27:06,100 --> 00:27:12,030 gõ, vì tất cả các con trỏ chỉ địa chỉ, bốn hoặc tám byte. 513 00:27:12,030 --> 00:27:14,030 Vì vậy, chúng ta hãy xem lại này sơ đồ và chúng ta hãy kết luận 514 00:27:14,030 --> 00:27:18,130 video này với một bài tập nhỏ ở đây. 515 00:27:18,130 --> 00:27:21,600 Vì vậy, đây là sơ đồ chúng ta rời đi với lúc bắt đầu của video. 516 00:27:21,600 --> 00:27:23,110 Vì vậy, những gì sẽ xảy ra nếu tôi nói * pk = 35? 517 00:27:23,110 --> 00:27:26,370 518 00:27:26,370 --> 00:27:30,530 Vì vậy, nó có nghĩa gì khi tôi nói, * pk = 35? 519 00:27:30,530 --> 00:27:32,420 Mất một giây. 520 00:27:32,420 --> 00:27:34,990 * pk. 521 00:27:34,990 --> 00:27:39,890 Trong bối cảnh ở đây, là * toán tử tham chiếu. 522 00:27:39,890 --> 00:27:42,110 Vì vậy, khi tới đích điều hành được sử dụng, 523 00:27:42,110 --> 00:27:48,520 chúng tôi đi đến địa chỉ được trỏ tới bởi pk, và chúng ta thay đổi những gì chúng tôi tìm thấy. 524 00:27:48,520 --> 00:27:55,270 So * pk = 35 có hiệu quả thực hiện điều này với hình ảnh. 525 00:27:55,270 --> 00:27:58,110 Vì vậy, về cơ bản nó cú pháp giống của có nói k = 35. 526 00:27:58,110 --> 00:28:00,740 527 00:28:00,740 --> 00:28:01,930 >> Một lần nữa. 528 00:28:01,930 --> 00:28:05,510 Nếu tôi nói int m, tôi tạo ra một biến mới gọi là m. 529 00:28:05,510 --> 00:28:08,260 Một hộp mới, đó là một hộp màu xanh lá cây vì nó sẽ giữ một số nguyên, 530 00:28:08,260 --> 00:28:09,840 và nó có nhãn m. 531 00:28:09,840 --> 00:28:14,960 Nếu tôi nói m = 4, tôi đặt một số nguyên vào hộp đó. 532 00:28:14,960 --> 00:28:20,290 Nếu nói pk = & m, làm thế nào sơ đồ này thay đổi? 533 00:28:20,290 --> 00:28:28,760 Pk = & m, làm bạn nhớ lại những gì & Điều hành nào hay được gọi là? 534 00:28:28,760 --> 00:28:34,430 Hãy nhớ rằng một số tên biến & là địa chỉ của một tên biến. 535 00:28:34,430 --> 00:28:38,740 Vì vậy, những gì chúng ta đang nói là pk có được địa chỉ của m. 536 00:28:38,740 --> 00:28:42,010 Và như vậy có hiệu quả những gì xảy ra sơ đồ là pk điểm không còn 537 00:28:42,010 --> 00:28:46,420 k, nhưng điểm đến m. 538 00:28:46,420 --> 00:28:48,470 >> Một lần nữa con trỏ là rất khó khăn để làm việc với 539 00:28:48,470 --> 00:28:50,620 và họ mất rất nhiều thực hành, nhưng vì 540 00:28:50,620 --> 00:28:54,150 khả năng của mình để cho phép bạn để truyền dữ liệu giữa các chức năng 541 00:28:54,150 --> 00:28:56,945 và thực sự có những thay đổi có hiệu lực, 542 00:28:56,945 --> 00:28:58,820 việc đầu của bạn xung quanh là thực sự quan trọng. 543 00:28:58,820 --> 00:29:02,590 Nó có lẽ là phức tạp nhất chủ đề được thảo luận ở CS50, 544 00:29:02,590 --> 00:29:05,910 nhưng giá trị mà bạn có được từ việc sử dụng con trỏ 545 00:29:05,910 --> 00:29:09,200 xa giá trị hơn các biến chứng mà đến từ việc học chúng. 546 00:29:09,200 --> 00:29:12,690 Vì vậy, tôi muốn bạn tốt nhất của may mắn học hỏi về con trỏ. 547 00:29:12,690 --> 00:29:15,760 Tôi Doug Lloyd, đây là CS50. 548 00:29:15,760 --> 00:29:17,447