1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] اجازه دهید بحث در مورد آرایه. 2 00:00:09,360 --> 00:00:12,780 پس چرا ما همیشه مایل به استفاده از آرایه؟ 3 00:00:12,780 --> 00:00:17,210 خوب اجازه دهید به شما می گویند یک برنامه است که نیاز به ذخیره 5 شناسه دانشجوی. 4 00:00:17,210 --> 00:00:21,270 این ممکن است به نظر می رسد معقول و منطقی به 5 متغیر جداگانه است. 5 00:00:21,270 --> 00:00:24,240 برای دلایلی که ما را در یک بیت را ببینید، ما شروع به شمارش از 0. 6 00:00:24,240 --> 00:00:30,700 متغیرهای ما باید id0 هوشمند، ID1 هوشمند، و غیره. 7 00:00:30,700 --> 00:00:34,870 هر گونه منطق ما می خواهیم بر روی ID دانشجویی انجام خواهد شد نیاز به کپی و جا به جا 8 00:00:34,870 --> 00:00:36,870 برای هر کدام از شناسه های دانشجویی. 9 00:00:36,870 --> 00:00:39,710 اگر ما می خواهیم به بررسی کنید که دانش آموزان اتفاق می افتد به در CS50، 10 00:00:39,710 --> 00:00:43,910 ما برای اولین بار می خواهید برای بررسی id0 نشان دهنده دانش آموز در این دوره نیاز دارند. 11 00:00:43,910 --> 00:00:48,070 سپس همین کار را برای دانش آموز بعدی، ما نیاز به کپی و چسباندن کد برای id0 12 00:00:48,070 --> 00:00:54,430 و به جای همه ظهور id0 ID1 و به همین ترتیب برای ID2، 3، و 4. 13 00:00:54,430 --> 00:00:57,560 >> به محض این که شما می شنوید که ما نیاز به کپی و چسباندن، 14 00:00:57,560 --> 00:01:00,440 شما باید شروع به فکر کردن است که یک راه حل بهتر وجود دارد. 15 00:01:00,440 --> 00:01:05,360 حالا چه می شود اگر شما متوجه شما 5 شناسه دانش آموزان نیاز ندارد بلکه 7؟ 16 00:01:05,360 --> 00:01:09,570 شما باید به کد منبع خود را برای رفتن به عقب و اضافه کردن در ID5، id6، 17 00:01:09,570 --> 00:01:14,260 و کپی کنید و از منطق برای چک کردن در صورتی که شناسه متعلق به کلاس این 2 شناسه جدید. 18 00:01:14,260 --> 00:01:19,600 هیچ چیز اتصال همه این شناسه ها با یکدیگر وجود دارد، و بنابراین هیچ راهی برای درخواست وجود دارد 19 00:01:19,600 --> 00:01:22,040 برنامه ای برای انجام این کار برای شناسه 0 تا 6 است. 20 00:01:22,040 --> 00:01:26,120 خوب حالا شما متوجه شما 100 شناسه دانش آموز است. 21 00:01:26,120 --> 00:01:30,770 آن شروع به نظر می رسد کمتر از ایده آل باید به طور جداگانه اعلام هر یک از این شناسه، 22 00:01:30,770 --> 00:01:33,760 و کپی کنید و هر گونه منطق برای آن دسته از شناسه جدید. 23 00:01:33,760 --> 00:01:38,380 اما شاید ما در حال تعیین می کند، و ما این کار را برای هر 100 دانش آموز است. 24 00:01:38,380 --> 00:01:42,240 اما چه می شود اگر شما نمی دانید که چگونه بسیاری از دانشجویان در واقع وجود دارد؟ 25 00:01:42,240 --> 00:01:47,320 فقط برخی از دانشجویان N وجود دارد و برنامه خود را به درخواست کاربر چه که N است. 26 00:01:47,320 --> 00:01:50,250 آه آه. این است که کار نمی کند خیلی خوب است. 27 00:01:50,250 --> 00:01:53,820 برنامه شما تنها برای برخی از شماره های ثابت از دانش آموزان کار می کند. 28 00:01:53,820 --> 00:01:57,520 >> حل تمام این مشکلات زیبایی از آرایه است. 29 00:01:57,520 --> 00:01:59,930 پس چه شده است یک آرایه؟ 30 00:01:59,930 --> 00:02:04,480 در برخی از زبان های برنامه نویسی از نوع آرایه ممکن است قادر به انجام یک کمی بیشتر 31 00:02:04,480 --> 00:02:09,960 اما در اینجا، ما فقط به عنوان ساختار داده ها در آرایه اصلی تمرکز شما آن را در C. را ببینید 32 00:02:09,960 --> 00:02:14,030 آرایه یک بلوک بزرگ از حافظه است. همین. 33 00:02:14,030 --> 00:02:17,770 هنگامی که ما می گویند که ما باید مجموعه ای از 10 عدد صحیح، که فقط معنی است که ما باید برخی از بلوک 34 00:02:17,770 --> 00:02:20,740 از حافظه است که به اندازه کافی بزرگ برای نگهداری 10 عدد صحیح جداگانه است. 35 00:02:29,930 --> 00:02:33,410 فرض کنید که یک عدد صحیح 4 بایت، این به این معنی است که مجموعه ای از 10 عدد صحیح 36 00:02:33,410 --> 00:02:37,180 یک بلوک مداوم از 40 بایت در حافظه است. 37 00:02:42,660 --> 00:02:46,280 حتی زمانی که شما با استفاده از آرایه های چند بعدی، که ما آن را نمی خواهد به اینجا بروید. 38 00:02:46,280 --> 00:02:49,200 هنوز فقط یک بلوک بزرگ از حافظه است. 39 00:02:49,200 --> 00:02:51,840 نماد چند بعدی است فقط یک راحتی است. 40 00:02:51,840 --> 00:02:55,640 اگر شما 3 3 آرایه های چند بعدی از اعداد صحیح، 41 00:02:55,640 --> 00:03:00,650 و سپس برنامه خود را واقعا فقط این کار را به عنوان یک بلوک بزرگ از 36 بایت را درمان کنند. 42 00:03:00,650 --> 00:03:05,460 تعداد کل اعداد صحیح 3 بار در 3 است، و هر عدد صحیح طول می کشد تا 4 بایت است. 43 00:03:05,460 --> 00:03:07,750 >> بیایید نگاهی به یک نمونه اولیه. 44 00:03:07,750 --> 00:03:10,660 ما در اینجا می توانید ببینید 2 راه مختلف آرایه های اعلام. 45 00:03:15,660 --> 00:03:18,580 ما باید به نظر 1 از آنها برای برنامه ای برای تدوین 46 00:03:18,580 --> 00:03:20,900 از آنجایی که x به ما اعلام دو برابر است. 47 00:03:20,900 --> 00:03:25,140 ما می خواهیم نگاهی به برخی از تفاوت های بین این 2 نوع اظهارات در بیت. 48 00:03:25,140 --> 00:03:28,560 هر دوی این خطوط اعلان یک آرایه N اندازه، 49 00:03:28,560 --> 00:03:30,740 که در آن ما # N به عنوان 10 را تعریف کنیم. 50 00:03:30,740 --> 00:03:34,460 ما فقط می تواند به راحتی کاربر را برای یک عدد صحیح مثبت خواسته 51 00:03:34,460 --> 00:03:37,250 و استفاده می شود که عدد صحیح را به عنوان تعدادی از عناصر در آرایه. 52 00:03:37,250 --> 00:03:41,960 مانند ID دانشجوی مثال ما قبل از این نوع مانند اعلام 10 به طور کامل جدا 53 00:03:41,960 --> 00:03:49,000 متغیر خیالی، x0، X1، X2، و غیره تا به xN-1. 54 00:03:57,270 --> 00:04:00,840 نادیده گرفتن این خطوط که در آن ما اعلام آرایه، متوجه براکت دست نخورده 55 00:04:00,840 --> 00:04:02,090 در داخل حلقه for. 56 00:04:02,090 --> 00:04:09,660 وقتی ما به نوشتن چیزی شبیه به X [3]، که من فقط به عنوان براکت X 3 به عنوان خوانده شده 57 00:04:09,660 --> 00:04:13,090 شما می توانید از آن فکر می کنم مانند درخواست برای X3 خیالی. 58 00:04:13,090 --> 00:04:17,519 توجه داشته باشید که در مقایسه با آرایه ای از اندازه N، این بدان معنی است که در داخل براکت 59 00:04:17,519 --> 00:04:22,630 کنیم که شاخص تماس بگیرید، می تواند هر چیزی باشد از 0 تا N-1، 60 00:04:22,630 --> 00:04:25,660 که در مجموع شاخص های N است. 61 00:04:25,660 --> 00:04:28,260 >> برای فکر کردن در مورد چگونه این در واقع کار می کند 62 00:04:28,260 --> 00:04:31,260 به یاد داشته باشید که آرایه یک بلوک بزرگ از حافظه است. 63 00:04:31,260 --> 00:04:37,460 فرض کنید که یک عدد صحیح 4 بایت، X آرایه کل یک بلوک 40 بایت از حافظه است. 64 00:04:37,460 --> 00:04:41,360 بنابراین x0 اشاره به 4 بایت اول از بلوک. 65 00:04:45,810 --> 00:04:49,230 X [1] اشاره به 4 بایت بعدی و به همین ترتیب. 66 00:04:49,230 --> 00:04:53,760 این به این معنی است که از آغاز X همه برنامه همیشه نیاز به پیگیری است. 67 00:04:55,660 --> 00:04:59,840 اگر شما می خواهید به استفاده از X [400]، و سپس این برنامه می داند این است که معادل 68 00:04:59,840 --> 00:05:03,460 به تنها 1،600 بایت پس از آغاز X. 69 00:05:03,460 --> 00:05:08,780 کجا ما 1600 کلمه در ادامه متن از؟ 400 بار 4 بایت در هر عدد صحیح است. 70 00:05:08,780 --> 00:05:13,170 >> قبل از حرکت، بسیار مهم است برای تحقق بخشیدن به آن را که در C 71 00:05:13,170 --> 00:05:17,080 اجرای شاخص است که ما در آرایه استفاده وجود دارد. 72 00:05:17,080 --> 00:05:23,180 بلوک بزرگ ما این است که تنها 10 عدد صحیح است، اما هیچ چیز به ما داد اگر ما به نوشتن X [20] 73 00:05:23,180 --> 00:05:26,060 یا حتی X [-5]. 74 00:05:26,060 --> 00:05:28,240 این شاخص هم ندارد یک عدد به. 75 00:05:28,240 --> 00:05:30,630 این می تواند هر عبارت دلخواه. 76 00:05:30,630 --> 00:05:34,800 در این برنامه ما از من متغیر استفاده از حلقه for به شاخص به آرایه. 77 00:05:34,800 --> 00:05:40,340 این یک الگوی بسیار رایج است، برگرفته از i = 0 به طول آرایه، 78 00:05:40,340 --> 00:05:43,350 و پس از آن من با استفاده از به عنوان شاخص آرایه. 79 00:05:43,350 --> 00:05:46,160 در این روش شما به طور موثر بر روی کل آرایه حلقه، 80 00:05:46,160 --> 00:05:50,600 و شما هم می توانید به هر نقطه در آرایه اختصاص و یا استفاده از آن را برای برخی از محاسبات است. 81 00:05:50,600 --> 00:05:53,920 >> در اولین حلقه، من از 0 شروع می شود، 82 00:05:53,920 --> 00:05:58,680 و پس از آن به نقطه 0 در آرایه، مقدار 0 بار 2 اختصاص دهید. 83 00:05:58,680 --> 00:06:04,370 پس از آن من افزایش است، و ما اختصاص به نقطه اول در آرایه مقدار 1 بار 2. 84 00:06:04,370 --> 00:06:10,170 پس از آن من افزایش دوباره و به همین ترتیب تا تا زمانی که ما اختصاص به موقعیت N-1 در آرایه 85 00:06:10,170 --> 00:06:13,370 مقدار N-1 بار 2. 86 00:06:13,370 --> 00:06:17,810 بنابراین ما ایجاد کرده اید آرایه با 10 عدد اول حتی. 87 00:06:17,810 --> 00:06:21,970 شاید evens می شده اند یک نام برای متغیر کمی بهتر از X، 88 00:06:21,970 --> 00:06:24,760 اما که می توانست با توجه به چیزهای دور. 89 00:06:24,760 --> 00:06:30,210 دومی برای حلقه فقط چاپ ارزش است که ما در حال حاضر در داخل آرایه ذخیره می شود. 90 00:06:30,210 --> 00:06:33,600 >> بیایید سعی کنید در حال اجرا برنامه با هر دو نوع از اظهارات آرایه 91 00:06:33,600 --> 00:06:36,330 و نگاهی به در خروجی برنامه. 92 00:06:51,450 --> 00:06:57,020 تا آنجا که ما مشاهده می کنید، رفتار این برنامه راه یکسان برای هر دو نوع از این اظهارات است. 93 00:06:57,020 --> 00:07:02,230 بیایید نگاهی به آنچه اتفاق می افتد در صورتی که حلقه اول تغییر در N متوقف نمی 94 00:07:02,230 --> 00:07:05,040 اما به جای 10،000 گویند. 95 00:07:05,040 --> 00:07:07,430 فراتر از آرایه. 96 00:07:14,700 --> 00:07:17,210 متأسفم. شاید شما دیده ام پیش از این. 97 00:07:17,210 --> 00:07:20,440 گسل تقسیم بندی به معنای برنامه شما خراب شده است. 98 00:07:20,440 --> 00:07:24,430 شما شروع به دیدن این مناطق از حافظه شما نباید لمس کردن لمس می کنی. 99 00:07:24,430 --> 00:07:27,870 در اینجا ما در حال دست زدن به 10،000 منطقه فراتر از آغاز X، 100 00:07:27,870 --> 00:07:31,920 که آشکارا یک محل در حافظه ما نباید لمس کردن است. 101 00:07:31,920 --> 00:07:37,690 بنابراین بسیاری از ما احتمالا به طور تصادفی خواهد بود قرار نمی 10،000 به جای N، 102 00:07:37,690 --> 00:07:42,930 اما چه می شود اگر ما چیزی بیشتر ظریف مانند نوشتن می گویند کمتر از یا برابر با N 103 00:07:42,930 --> 00:07:46,830 در شرط حلقه به عنوان مخالف به کمتر از N. 104 00:07:46,830 --> 00:07:50,100 به یاد داشته باشید که یک آرایه فقط شاخص از 0 تا N-1، 105 00:07:50,100 --> 00:07:54,510 که بدان معنی است که شاخص N است که فراتر از آرایه. 106 00:07:54,510 --> 00:07:58,050 این برنامه ممکن است سقوط در این مورد، اما هنوز هم خطا. 107 00:07:58,050 --> 00:08:01,950 در واقع، این خطا است چنان شایع است که آن را تا به نام خود آن را، 108 00:08:01,950 --> 00:08:03,970 خاموش توسط 1 خطا. 109 00:08:03,970 --> 00:08:05,970 >> است که آن را برای اصول اولیه است. 110 00:08:05,970 --> 00:08:09,960 پس چه تفاوت عمده بین 2 نوع از اظهارات آرایه؟ 111 00:08:09,960 --> 00:08:13,960 یکی از تفاوت این است که در آن بلوک بزرگی از حافظه می رود. 112 00:08:13,960 --> 00:08:17,660 در اعلامیه اول، که من نوع براکت آرایه تماس بگیرید، 113 00:08:17,660 --> 00:08:20,300 اگر چه این به هیچ وجه یک نام متعارف، 114 00:08:20,300 --> 00:08:22,480 آن را بر روی پشته بروید. 115 00:08:22,480 --> 00:08:27,450 در حالی که در دوم، که من از نوع اشاره گر آرایه تماس بگیرید، آن را بر روی پشته. 116 00:08:27,450 --> 00:08:32,480 این به این معنی که هنگامی که بازده تابع، آرایه براکت به طور خودکار خواهد شد deallocated، 117 00:08:32,480 --> 00:08:36,419 در حالی که شما را به عنوان explicitily تماس رایگان بر روی آرایه ای از اشاره گر 118 00:08:36,419 --> 00:08:38,010 و یا اگر شما نشت حافظه. 119 00:08:38,010 --> 00:08:42,750 علاوه بر این، آرایه براکت است که در واقع نه یک متغیر است. 120 00:08:42,750 --> 00:08:45,490 این مهم است. این فقط یک نماد است. 121 00:08:45,490 --> 00:08:49,160 شما می توانید از آن به عنوان یک ثابت است که کامپایلر برای شما انتخاب فکر می کنم. 122 00:08:49,160 --> 00:08:52,970 این به این معنی است که ما می تواند چیزی شبیه به X + + با توجه به نوع براکت، 123 00:08:52,970 --> 00:08:56,240 هر چند این کاملا معتبر با نوع اشاره گر است. 124 00:08:56,240 --> 00:08:58,270 >> نوع داده اشاره گر یک متغیر است. 125 00:08:58,270 --> 00:09:01,510 نوع اشاره گر، ما باید 2 بلوک مجزا از حافظه است. 126 00:09:01,510 --> 00:09:06,060 متغیر x خود را در پشته ذخیره می شود و فقط یک اشاره گر است، 127 00:09:06,060 --> 00:09:08,620 اما بلوک بزرگ از حافظه در پشته ذخیره می شود. 128 00:09:08,620 --> 00:09:11,010 متغیر x را بر روی پشته ذخیره آدرس 129 00:09:11,010 --> 00:09:14,010 از بلوک های بزرگی از حافظه در پشته. 130 00:09:14,010 --> 00:09:17,370 یک مفهوم این است که با اندازه اپراتور است. 131 00:09:17,370 --> 00:09:22,480 اگر شما برای اندازه آرایه براکت بخواهید، آن را به شما به اندازه بلوک های بزرگی از حافظه را، 132 00:09:22,480 --> 00:09:24,620 چیزی مانند 40 کلمه در ادامه متن 133 00:09:24,620 --> 00:09:26,920 اما اگر شما به اندازه از نوع اشاره گر آرایه بپرسید، 134 00:09:26,920 --> 00:09:32,740 آن را به شما به اندازه متغیر x خود را، که بر روی دستگاه به احتمال زیاد فقط 4 بایت می دهد. 135 00:09:32,740 --> 00:09:36,530 با استفاده از نوع اشاره گر آرایه، آن است که غیر ممکن است به طور مستقیم به درخواست 136 00:09:36,530 --> 00:09:38,530 اندازه بلوک های بزرگی از حافظه است. 137 00:09:38,530 --> 00:09:42,530 این امر معمولا بسیاری از محدودیت نمی باشد، از آنجایی که ما بسیار به ندرت می خواهید اندازه 138 00:09:42,530 --> 00:09:46,980 بلوک بزرگی از حافظه، و ما معمولا می توانید آن را محاسبه اگر ما به آن نیاز دارند. 139 00:09:46,980 --> 00:09:51,490 >> در نهایت، آرایه براکت اتفاق می افتد، ما با یک میانبر برای مقدار دهی اولیه به آرایه. 140 00:09:51,490 --> 00:09:56,130 بیایید ببینید که چگونه ما می تواند اعداد صحیح از 10 اول حتی با استفاده از initilization میانبر ارسال. 141 00:10:11,220 --> 00:10:14,470 با استفاده از آرایه ای از اشاره گر، یک راه برای انجام یک میانبر مانند این وجود ندارد. 142 00:10:14,470 --> 00:10:18,120 این است که فقط معرفی به آنچه که شما می توانید با آرایه انجام دهید. 143 00:10:18,120 --> 00:10:20,990 آنها نشان می دهد در تقریبا در هر برنامه تو می نویسم. 144 00:10:20,990 --> 00:10:24,390 امیدوارم شما هم اکنون می توانید راه بهتری برای انجام این کار دانش آموز به عنوان مثال شناسه را ببینید 145 00:10:24,390 --> 00:10:26,710 از آغاز از ویدئو. 146 00:10:26,710 --> 00:10:29,960 >> نام من راب Bowden، و این CS50.