1 00:00:00,000 --> 00:00:02,520 [Powered by Google Translate] [بخش 4 - راحت تر] 2 00:00:02,520 --> 00:00:04,850 [راب Bowden - دانشگاه هاروارد 3 00:00:04,850 --> 00:00:07,370 [این CS50 است. - CS50.TV] 4 00:00:08,920 --> 00:00:13,350 ما فردا مسابقه، در صورتی که شما بچه ها نمی دانستند که. 5 00:00:14,810 --> 00:00:20,970 اساسا در همه چیز شما می توانید در کلاس دیده می شود و یا باید در کلاس دیده می شود. 6 00:00:20,970 --> 00:00:26,360 که شامل اشاره گر، حتی اگر آنها به یک موضوع بسیار جدید است. 7 00:00:26,360 --> 00:00:29,860 شما حداقل باید درک سطوح بالایی از آنها است. 8 00:00:29,860 --> 00:00:34,760 هر چیزی که در کلاس شما باید برای مسابقه را درک رفته بود. 9 00:00:34,760 --> 00:00:37,320 پس اگر سوالی دارید و بر روی آنها، شما می توانید آنها را در حال حاضر بپرسید. 10 00:00:37,320 --> 00:00:43,280 اما این رفتن به یک جلسه دانشجویی به رهبری که در آن شما بچه ها سوال بپرسید 11 00:00:43,280 --> 00:00:45,060 بنابراین امیدوارم مردم سوال. 12 00:00:45,060 --> 00:00:48,020 آیا کسی است؟ 13 00:00:49,770 --> 00:00:52,090 بله. >> [دانشجو] آیا می توانم شما را بیش از اشاره گرها دوباره؟ 14 00:00:52,090 --> 00:00:54,350 من بیش از اشاره گر بروید. 15 00:00:54,350 --> 00:00:59,180 تمامی متغیر ها لزوما در حافظه زندگی می کنند، 16 00:00:59,180 --> 00:01:04,450 اما معمولا شما را در مورد آن نگران نباشید و شما فقط می گویند X + 2 و y + 3 17 00:01:04,450 --> 00:01:07,080 و کامپایلر خواهد شد که در آن همه چیز در زندگی برای شما. 18 00:01:07,080 --> 00:01:12,990 هنگامی که شما در حال خرید و فروش با اشاره گر، در حال حاضر شما به صراحت با استفاده از آن آدرس حافظه است. 19 00:01:12,990 --> 00:01:19,800 بنابراین یک متغیر تنها تنها همیشه در یک آدرس واحد را در هر زمان داده شده زندگی می کنند. 20 00:01:19,800 --> 00:01:24,040 اگر ما می خواهیم به تعریف یک اشاره گر، چه نوع شبیه؟ 21 00:01:24,040 --> 00:01:26,210 >> من می خواهم به اعلام یک اشاره گر P. چه نوع شکلی است؟ 22 00:01:26,210 --> 00:01:33,530 [دانشجوی] اعضای هیات * ص. >> آره. بنابراین اعضای هیات * ص. 23 00:01:33,530 --> 00:01:38,030 و چگونه می توانم آن را اشاره به X؟ >> [دانشجو] امپرسند. 24 00:01:40,540 --> 00:01:45,300 [Bowden] بنابراین علامت است که به معنای واقعی کلمه به نام آدرس اپراتور است. 25 00:01:45,300 --> 00:01:50,460 بنابراین، هنگامی که من می گویم و X آن را به آدرس حافظه متغیر x است. 26 00:01:50,460 --> 00:01:56,790 بنابراین در حال حاضر من از اشاره گر P، و در هر نقطه در کد من من می توانم * P استفاده کنید 27 00:01:56,790 --> 00:02:02,960 یا من می توانم X و استفاده از آن خواهد بود که دقیقا همان است. 28 00:02:02,960 --> 00:02:09,520 (* p). چه انجام شده است؟ چه آن ستاره چیست؟ 29 00:02:09,520 --> 00:02:13,120 [دانشجو] این به این معنی ارزش در آن نقطه است. >> آره. 30 00:02:13,120 --> 00:02:17,590 بنابراین، اگر ما در آن نگاه کنید، آن می تواند بسیار مفید برای رسم نمودار 31 00:02:17,590 --> 00:02:22,230 که این یک جعبه کوچک حافظه برای x، که اتفاق می افتد را به ارزش 4 است، 32 00:02:22,230 --> 00:02:25,980 پس ما باید یک جعبه کوچک حافظه برای P 33 00:02:25,980 --> 00:02:31,590 و به همین ترتیب نقاط P به X است، بنابراین یک پیکان از P به X کنیم. 34 00:02:31,590 --> 00:02:40,270 بنابراین، هنگامی که ما می گویند P * ما گفت: رفتن به جعبه است که P. 35 00:02:40,270 --> 00:02:46,480 ستاره است به دنبال فلش و پس از آن به انجام هر کاری که شما با این جعبه می خواهید سمت راست وجود دارد. 36 00:02:46,480 --> 00:03:01,090 بنابراین من می توانم بگویم * p = 7؛ و آن را به جعبه است که X و تغییر که به 7. 37 00:03:01,090 --> 00:03:13,540 یا من می توانم بگویم اعضای هیات z = * P * 2؛ که گیج کننده است چون آن ستاره، ستاره است. 38 00:03:13,540 --> 00:03:19,230 یک ستاره است بصورت غیر مرجع P، ستاره دیگر این است که به ضرب در 2 است. 39 00:03:19,230 --> 00:03:26,780 توجه داشته باشید که من می توانستم فقط به عنوان به خوبی P * با X جایگزین. 40 00:03:26,780 --> 00:03:29,430 شما می توانید آنها را در راه همان استفاده کنید. 41 00:03:29,430 --> 00:03:38,000 و سپس بعد از من می تواند نقطه P را به یک چیز کاملا جدید را داشته باشد. 42 00:03:38,000 --> 00:03:42,190 من فقط می توانم بگویم p = &z؛ 43 00:03:42,190 --> 00:03:44,940 بنابراین در حال حاضر بدون امتیاز دیگر به X فسفر، آن را به Z. 44 00:03:44,940 --> 00:03:50,510 و هر زمان که من P * همان انجام Z است. 45 00:03:50,510 --> 00:03:56,170 بنابراین چیزی در این مورد مفید است زمانی که ما شروع به وارد شدن به توابع. 46 00:03:56,170 --> 00:03:59,790 >> این نوع از بی فایده به تعریف یک اشاره گر است که به چیزی 47 00:03:59,790 --> 00:04:03,140 و سپس شما فقط آن را غیر مرجع 48 00:04:03,140 --> 00:04:06,060 زمانی که شما می توانید با استفاده از این متغیر اصلی برای شروع با. 49 00:04:06,060 --> 00:04:18,190 اما هنگامی که شما را به توابع - بنابراین می گویند ما باید برخی از تابع، نوع int صنایع غذایی، 50 00:04:18,190 --> 00:04:32,810 طول می کشد که یک اشاره گر است و فقط * p = 6؛ 51 00:04:32,810 --> 00:04:39,990 ما قبل از تعویض در حالت روشن را دیدم، شما می توانید یک مبادله موثر و یک تابع جداگانه انجام نمی 52 00:04:39,990 --> 00:04:45,180 فقط اعداد صحیح عبور از آنجا که همه چیز در C همیشه با ارزش عبور. 53 00:04:45,180 --> 00:04:48,360 حتی زمانی که شما در حال عبور از اشاره گرها در حال عبور با ارزش شما است. 54 00:04:48,360 --> 00:04:51,940 این فقط اتفاق می افتد که این ارزش ها، آدرس های حافظه می باشد. 55 00:04:51,940 --> 00:05:00,770 بنابراین، هنگامی که من می گویم صنایع غذایی (p)؛ من عبور از اشاره گر به تابع صنایع غذایی 56 00:05:00,770 --> 00:05:03,910 و پس از آن صنایع غذایی انجام شده است * p = 6؛ 57 00:05:03,910 --> 00:05:08,600 بنابراین در داخل آن تابع، * P هنوز معادل X، 58 00:05:08,600 --> 00:05:12,720 اما من می توانم X در داخل آن تابع استفاده نمی کند چرا که آن را در داخل آن تابع scoped نیست. 59 00:05:12,720 --> 00:05:19,510 پس * p = (6) تنها راهی که من می توانم یک متغیر محلی از یک تابع دیگر دسترسی داشته باشید. 60 00:05:19,510 --> 00:05:23,600 یا، به خوبی، اشاره گرها تنها راهی که من می تواند یک متغیر محلی از یک تابع دیگر دسترسی داشته باشید. 61 00:05:23,600 --> 00:05:31,600 [دانشجو] بیایید می گویند شما می خواهید به بازگشت به یک اشاره گر است. شما دقیقا چگونه انجام این کار؟ 62 00:05:31,600 --> 00:05:44,270 Bowden [] بازگشت یک اشاره گر را به عنوان چیزی شبیه به y هوشمند = 3، بازگشت و Y؟ >> [دانشجو] آره. 63 00:05:44,270 --> 00:05:48,480 [Bowden] باشه. شما باید این کار را انجام دهند هرگز. این بد است. 64 00:05:48,480 --> 00:05:59,480 من فکر می کنم من در این اسلاید سخنرانی دیدم شما شروع به دیدن این نمودار تمام حافظه 65 00:05:59,480 --> 00:06:02,880 جایی که اینجا شما رو آدرس حافظه 0 66 00:06:02,880 --> 00:06:09,550 و پایین در اینجا شما باید حافظه را آدرس 4 گیگابایت یا 2 تا از 32. 67 00:06:09,550 --> 00:06:15,120 بنابراین پس از آن شما و برخی چیزهای برخی چیزهای و سپس پشته خود را به شما 68 00:06:15,120 --> 00:06:21,780 و شما رو پشته خود را، که شما فقط شروع به یادگیری در مورد، در حال رشد کردن است. 69 00:06:21,780 --> 00:06:24,390 [دانشجو] پشته در بالای پشته است؟ 70 00:06:24,390 --> 00:06:27,760 >> آره. پشته در بالای صفحه است، نه؟ >> [دانشجو] خب، او 0 در بالا قرار داده است. 71 00:06:27,760 --> 00:06:30,320 [دانشجو] اوه، او 0 در بالا قرار داده است. >> [دانشجو] اوه، درست است. 72 00:06:30,320 --> 00:06:36,060 سلب مسئولیت: در هر نقطه با CS50 شما در حال رفتن به آن را در این راه است. >> [دانشجو] باشه. 73 00:06:36,060 --> 00:06:40,290 مسئله این است که زمانی که شما برای اولین بار دیدن پشته، 74 00:06:40,290 --> 00:06:45,000 مانند وقتی که شما از پشته شما را از انباشته چیزهایی در بالای یکدیگر فکر می کنم فکر می کنم. 75 00:06:45,000 --> 00:06:50,810 بنابراین ما تمایل به این تلنگر را در اطراف پشته در حال رشد است تا مانند یک پشته به طور معمول 76 00:06:50,810 --> 00:06:55,940 به جای پشته حلق آویز کردن. >> [دانشجو] انبوه نه از لحاظ فنی رشد تا بیش از حد، هر چند؟ 77 00:06:55,940 --> 00:07:01,100 در مورد آنچه که منظور شما رشد می کنند بستگی دارد. 78 00:07:01,100 --> 00:07:04,010 پشته و پشته همیشه در جهت مخالف رشد می کنند. 79 00:07:04,010 --> 00:07:09,420 پشته است که همیشه در حال رشد است تا به این معنا است که آن را در حال رشد است 80 00:07:09,420 --> 00:07:12,940 به سمت آدرس های حافظه بالاتر، و پشته در حال رشد است 81 00:07:12,940 --> 00:07:17,260 که در آن در حال رشد به سمت آدرس های حافظه کمتر است. 82 00:07:17,260 --> 00:07:20,250 بنابراین بالا است 0 و در پایین آدرس های حافظه بالا است. 83 00:07:20,250 --> 00:07:26,390 آنها هر دو در حال رشد، تنها در جهت مخالف است. 84 00:07:26,390 --> 00:07:29,230 [دانشجو] من فقط به این معنی بود که چون شما گفت که پشته قرار داده و شما را در پایین 85 00:07:29,230 --> 00:07:33,640 به دلیل آن به نظر می رسد بیشتر بصری است زیرا در بالای پشته پشته به شروع، 86 00:07:33,640 --> 00:07:37,520 پشته در بالا از خود بیش از حد، بنابراین that's - >> آره. 87 00:07:37,520 --> 00:07:44,960 شما هم از پشته به عنوان رو به رشد و بزرگتر فکر می کنم، اما پشته بیشتر از آن. 88 00:07:44,960 --> 00:07:50,280 پس پشته این است که ما را به نوعی نشان می دهد در حال رشد کردن است. 89 00:07:50,280 --> 00:07:55,390 اما در همه جا شما نگاه کنید در غیر این صورت رفتن به آدرس 0 در بالا نشان می دهد 90 00:07:55,390 --> 00:07:59,590 و بالاترین آدرس حافظه در پایین، بنابراین این دیدگاه به طور معمول خود را از حافظه است. 91 00:07:59,590 --> 00:08:02,100 >> آیا شما باید یک سوال؟ 92 00:08:02,100 --> 00:08:04,270 [دانشجو] آیا می توانید به ما بگویید بیشتر در مورد پشته؟ 93 00:08:04,270 --> 00:08:06,180 آره. من در یک ثانیه بدست آورید. 94 00:08:06,180 --> 00:08:12,220 اول، رفتن به چرا بازگشت و Y یک چیز بد است، 95 00:08:12,220 --> 00:08:18,470 در پشته شما باید یک دسته از قاب پشته که نشان دهنده از توابع 96 00:08:18,470 --> 00:08:20,460 شده اند که نامیده می شود. 97 00:08:20,460 --> 00:08:27,990 بنابراین نادیده گرفتن چیزهای قبلی، در بالای پشته خود را همیشه به تابع اصلی 98 00:08:27,990 --> 00:08:33,090 از آنجا که عملکرد برای اولین بار است که به نام است. 99 00:08:33,090 --> 00:08:37,130 و پس از آن هنگامی که شما به یک تابع دیگر، پشته به رشد کردن است. 100 00:08:37,130 --> 00:08:41,640 بنابراین اگر من تماس بگیرید برخی از تابع، صنایع غذایی می شود، و آن را قاب پشته خود را، 101 00:08:41,640 --> 00:08:47,280 آن را می توانید برخی از تابع، نوار تماس بگیرید، آن را می شود قاب پشته خود را. 102 00:08:47,280 --> 00:08:49,840 و نوار می تواند بازگشتی و آن را می تواند به خود تماس بگیرید. 103 00:08:49,840 --> 00:08:54,150 و به طوری که تماس دوم به نوار رفتن به قاب پشته خود را. 104 00:08:54,150 --> 00:08:58,880 و بنابراین، آنچه در این قاب پشته می رود همه از متغیرهای محلی 105 00:08:58,880 --> 00:09:03,450 و همه از آرگومان تابع که - 106 00:09:03,450 --> 00:09:08,730 هر چیز که در محل scoped به این تابع در این قاب پشته. 107 00:09:08,730 --> 00:09:21,520 بنابراین این بدان معناست که زمانی که من گفت: چیزی شبیه به نوار است یک تابع، 108 00:09:21,520 --> 00:09:29,270 من فقط رفتن به اعلام یک عدد صحیح و سپس بازگشت به یک اشاره گر به عدد صحیح است که. 109 00:09:29,270 --> 00:09:33,790 پس کجا Y زندگی می کنند؟ 110 00:09:33,790 --> 00:09:36,900 [دانشجوی] Y در نوار زندگی می کند. >> [Bowden] آره. 111 00:09:36,900 --> 00:09:45,010 جایی در این میدان کمی از حافظه یک مربع littler است که Y در آن است. 112 00:09:45,010 --> 00:09:53,370 وقتی که من بازگشت و Y، من بازگشت به یک اشاره گر به این بلوک کمی از حافظه است. 113 00:09:53,370 --> 00:09:58,400 اما پس از آن زمانی که بازده عملکرد، قاب پشته آن می شود ظهور پشته. 114 00:10:01,050 --> 00:10:03,530 و به همین دلیل است که آن را به نام پشته است. 115 00:10:03,530 --> 00:10:06,570 مانند ساختار پشته داده است، اگر شما می دانید چه چیزی است. 116 00:10:06,570 --> 00:10:11,580 و یا حتی مانند یک پشته از سینی است که همواره به عنوان مثال، 117 00:10:11,580 --> 00:10:16,060 اصلی است که در پایین بروید، سپس اولین تابعی که با شما تماس است که در بالا از آن، 118 00:10:16,060 --> 00:10:20,400 و شما نمی توانید برگشت به بخش اصلی تا زمانی که شما از تمام توابع است که به نام بازگشت 119 00:10:20,400 --> 00:10:22,340 شده است که در بالای آن قرار داده شده است. 120 00:10:22,340 --> 00:10:28,650 >> [دانشجو] بنابراین اگر شما انجام بازگشت به Y، که ارزش موضوع بدون اطلاع قبلی تغییر است. 121 00:10:28,650 --> 00:10:31,290 بله، it's - >> [دانش آموز] می تواند رونویسی. >> آره. 122 00:10:31,290 --> 00:10:34,660 این - اگر شما سعی می کنید و - 123 00:10:34,660 --> 00:10:38,040 این نیز یک نوار از نوع int * به دلیل آن را در بازگشت به یک اشاره گر، 124 00:10:38,040 --> 00:10:41,310 بنابراین نوع بازگشت آن * نوع int است. 125 00:10:41,310 --> 00:10:46,500 اگر شما سعی می کنید به استفاده از مقدار بازگشتی این تابع، آن رفتار تعریف نشده است 126 00:10:46,500 --> 00:10:51,770 چرا که اشاره گر اشاره به حافظه های بد است. >> [دانشجو] باشه. 127 00:10:51,770 --> 00:11:01,250 پس چه می شود اگر، برای مثال، شما اعلام اعضای هیات * Y = malloc (sizeof (هوشمند))؟ 128 00:11:01,250 --> 00:11:03,740 که بهتر است. بله. 129 00:11:03,740 --> 00:11:07,730 [دانشجو] ما در مورد چگونگی صحبت کردیم که چیزهایی که ما را بکشید به بن بازیافت ما 130 00:11:07,730 --> 00:11:11,750 آنها در واقع نه پاک، ما فقط از دست دادن اشاره گر خود را. 131 00:11:11,750 --> 00:11:15,550 بنابراین در این مورد ما در واقع ارزش و یا پاک کردن آن است که هنوز هم وجود دارد در حافظه؟ 132 00:11:15,550 --> 00:11:19,130 در اکثر موارد، آن را هنوز هم وجود دارد. 133 00:11:19,130 --> 00:11:24,220 اما اجازه دهید می گویند ما رخ می دهد برخی از عملکرد های دیگر، باز به تماس. 134 00:11:24,220 --> 00:11:28,990 باز رفتن به قاب پشته خود را در اینجا. 135 00:11:28,990 --> 00:11:31,470 این رفتن به جای نوشتن همه این مسائل، 136 00:11:31,470 --> 00:11:34,180 و پس از آن اگر شما بعدا کنید و سعی کنید با استفاده از اشاره گر است که شما قبل از رو، 137 00:11:34,180 --> 00:11:35,570 آن را نمی شود به همان مقدار است. 138 00:11:35,570 --> 00:11:38,150 رفتن به تغییر کرده فقط به خاطر اینکه شما به نام تابع باز است. 139 00:11:38,150 --> 00:11:43,080 [دانشجو] اما تا به حال ما، نمی خواهد ما هنوز 3 دریافت؟ 140 00:11:43,080 --> 00:11:44,990 [Bowden] در تمام احتمال، شما می توانید. 141 00:11:44,990 --> 00:11:49,670 اما شما نمی توانید بر روی آن تکیه می کنند. C فقط می گوید رفتار تعریف نشده است. 142 00:11:49,670 --> 00:11:51,920 >> [دانشجو] آه، آن هم اینکار را در مورد شما نمی کنند. باشه. 143 00:11:51,920 --> 00:11:58,190 بنابراین، هنگامی که شما می خواهید به بازگشت به اشاره گر، این است که malloc می آید در حال استفاده است. 144 00:12:00,930 --> 00:12:15,960 من نوشتن در واقع فقط بازگشت malloc (3 * sizeof (INT)). 145 00:12:17,360 --> 00:12:24,050 خواهیم بیش از malloc در یک ثانیه، اما این ایده از malloc از متغیرهای محلی خود را 146 00:12:24,050 --> 00:12:26,760 همیشه در پشته. 147 00:12:26,760 --> 00:12:31,570 هر چیزی که malloced می رود بر روی پشته، و آن را برای همیشه و همیشه در پشته 148 00:12:31,570 --> 00:12:34,490 تا زمانی که شما به صراحت این برنامه رایگان است. 149 00:12:34,490 --> 00:12:42,130 بنابراین این بدان معنی است که هنگامی که شما malloc چیزی، آن را به رفتن به زنده ماندن پس از گرداند. 150 00:12:42,130 --> 00:12:46,800 [دانشجو] از آن به زنده ماندن پس از برنامه های در حال اجرا را متوقف می کند؟ >> شماره 151 00:12:46,800 --> 00:12:53,180 خوب، پس از آن وجود داشته باشد تا این برنامه این است راه انجام می شود در حال اجرا است. >> بله. 152 00:12:53,180 --> 00:12:57,510 ما می توانیم به جزئیات چه اتفاقی می افتد هنگامی که برنامه در حال اجرا را متوقف می کند. 153 00:12:57,510 --> 00:13:02,150 شما ممکن است نیاز به من یادآوری است، اما یک چیز جداگانه ای به طور کامل. 154 00:13:02,150 --> 00:13:04,190 [دانشجو] پس malloc ایجاد یک اشاره گر است؟ >> آره. 155 00:13:04,190 --> 00:13:13,030 Malloc - >> [دانشجو] من فکر می کنم malloc تعیین یک بلاک از حافظه که اشاره گر می توانید استفاده کنید. 156 00:13:15,400 --> 00:13:19,610 [Bowden] من می خواهم که دوباره نمودار. >> [دانشجو] بنابراین این تابع کار می کند، هر چند است؟ 157 00:13:19,610 --> 00:13:26,430 [دانشجوی] بله، malloc تعیین یک بلوک از حافظه است که شما می توانید با استفاده از، 158 00:13:26,430 --> 00:13:30,470 و سپس آن را به آدرس بلوک برای اولین بار از این حافظه را بر می گرداند. 159 00:13:30,470 --> 00:13:36,750 >> [Bowden] آره. بنابراین، هنگامی که شما malloc، شما در حال گرفتن برخی از بلوک از حافظه 160 00:13:36,750 --> 00:13:38,260 که در حال حاضر در پشته. 161 00:13:38,260 --> 00:13:43,040 اگر پشته خیلی کوچک است، پس از آن پشته فقط رفتن به رشد، و آن را در این راستا رشد می کند. 162 00:13:43,040 --> 00:13:44,650 بنابراین می گویند که این پشته بیش از حد کوچک است. 163 00:13:44,650 --> 00:13:49,960 سپس آن را در مورد رشد کمی و بازگشت اشاره گر به این بلوک که فقط رشد است. 164 00:13:49,960 --> 00:13:55,130 هنگامی که شما چیزهای رایگان، شما در حال ساخت اتاق بیشتر در پشته، 165 00:13:55,130 --> 00:14:00,030 بنابراین پس از یک بعد به malloc تماس که می تواند حافظه که قبلا آزاد شده بود استفاده نمایید. 166 00:14:00,030 --> 00:14:09,950 نکته مهم در مورد malloc و رایگان است که آن را به شما می دهد کنترل کامل 167 00:14:09,950 --> 00:14:12,700 در طول عمر از بلوک های حافظه. 168 00:14:12,700 --> 00:14:15,420 متغیر های جهانی همیشه زنده است. 169 00:14:15,420 --> 00:14:18,500 متغیرهای محلی در حوزه خود زنده است. 170 00:14:18,500 --> 00:14:22,140 به محض این که شما در گذشته بریس فرفری، متغیرهای محلی هستند مرده است. 171 00:14:22,140 --> 00:14:28,890 حافظه Malloced زنده است، زمانی که شما می خواهید آن را به صورت زنده 172 00:14:28,890 --> 00:14:33,480 و پس از آن منتشر شده است هنگامی که آن را به شما بگویم و به بازار عرضه می شود. 173 00:14:33,480 --> 00:14:38,420 اینها در واقع تنها در 3 نوع از حافظه، واقعا. 174 00:14:38,420 --> 00:14:41,840 مدیریت حافظه اتوماتیک است که در پشته وجود دارد. 175 00:14:41,840 --> 00:14:43,840 چیزهایی که برای شما اتفاق می افتد به صورت خودکار. 176 00:14:43,840 --> 00:14:46,910 وقتی به شما می گویند نوع int X، حافظه X نوع int اختصاص داده شده است. 177 00:14:46,910 --> 00:14:51,630 هنگامی که X می رود از دامنه، حافظه X اصلاح شده است. 178 00:14:51,630 --> 00:14:54,790 سپس مدیریت حافظه پویا، که همان چیزی است که malloc است وجود دارد، 179 00:14:54,790 --> 00:14:56,740 است که هنگامی که شما به کنترل. 180 00:14:56,740 --> 00:15:01,290 شما به صورت پویا زمانی که حافظه و باید به نمی شود اختصاص داده تصمیم می گیرند. 181 00:15:01,290 --> 00:15:05,050 و سپس استاتیک وجود دارد، که این بدان معنی است که آن را زندگی می کند برای همیشه لطفا برای، 182 00:15:05,050 --> 00:15:06,610 که همان چیزی است که متغیر های جهانی می باشد. 183 00:15:06,610 --> 00:15:10,240 آنها همیشه در حافظه است. 184 00:15:10,960 --> 00:15:12,760 >> پرسش و پاسخ؟ 185 00:15:14,490 --> 00:15:17,230 [دانشجو] آیا می توانید یک بلوک تعریف می کنید و فقط با استفاده از آکولاد 186 00:15:17,230 --> 00:15:21,220 اما داشتن نیست که اگر بیانیه و یا در حالی که بیانیه و یا هر چیزی شبیه به آن 187 00:15:21,220 --> 00:15:29,130 شما می توانید یک بلوک را در یک تابع را تعریف کنیم، اما است که آکولاد بیش از حد است. 188 00:15:29,130 --> 00:15:32,100 [دانشجو] بنابراین شما فقط مانند یک جفت تصادفی از آکولاد نمی تواند در کد خود را داشته باشند 189 00:15:32,100 --> 00:15:35,680 که متغیرهای محلی؟ >> بله، شما می توانید. 190 00:15:35,680 --> 00:15:45,900 ما می تواند در داخل نوار داده int {دانشنامه هوشمند Y = 3؛} داشته باشد. 191 00:15:45,900 --> 00:15:48,440 که قرار است به حق در اینجا. 192 00:15:48,440 --> 00:15:52,450 اما که به طور کامل تعریف دامنه y هوشمند می باشد. 193 00:15:52,450 --> 00:15:57,320 پس از که بریس فرفری دوم، Y می توان استفاده نمی کنم. 194 00:15:57,910 --> 00:16:00,630 شما تقریبا هرگز انجام این کار، هر چند. 195 00:16:02,940 --> 00:16:07,370 برگشت به بخش چه اتفاقی می افتد زمانی که برنامه به پایان می رسد، 196 00:16:07,370 --> 00:16:18,760 نوع دروغ تصور غلط / نیم که ما به منظور فقط همه چیز را آسان تر را وجود دارد. 197 00:16:18,760 --> 00:16:24,410 ما به شما می گویند که هنگامی که شما به حافظه اختصاص دهد 198 00:16:24,410 --> 00:16:29,860 شما به اختصاص برخی از تکه از RAM را برای آن متغیر است. 199 00:16:29,860 --> 00:16:34,190 اما شما واقعا نه به طور مستقیم لمس RAM تا به حال در برنامه های خود. 200 00:16:34,190 --> 00:16:37,490 اگر شما از آن فکر می کنم، چگونه من کشید - 201 00:16:37,490 --> 00:16:44,330 و در واقع، اگر شما از طریق GDB شما همان چیزی را ببینید. 202 00:16:51,120 --> 00:16:57,590 صرف نظر از چند بار اجرای برنامه خود را و یا چه برنامه شما در حال اجرا، 203 00:16:57,590 --> 00:16:59,950 پشته همیشه برای شروع - 204 00:16:59,950 --> 00:17:06,510 شما همیشه برای دیدن متغیرهای اطراف چیزی oxbffff آدرس. 205 00:17:06,510 --> 00:17:09,470 معمولا در جایی در آن منطقه است. 206 00:17:09,470 --> 00:17:18,760 اما چگونه می توانید 2 برنامه احتمالا اشاره گر به حافظه؟ 207 00:17:20,640 --> 00:17:27,650 [دانشجو] برخی از طراحی دلخواه که در آن oxbfff قرار است در RAM وجود دارد. 208 00:17:27,650 --> 00:17:31,320 است که در واقع می تواند در مکان های مختلف با توجه به زمانی که تابع نامیده شد. 209 00:17:31,320 --> 00:17:35,920 آره. مدت حافظه مجازی است. 210 00:17:35,920 --> 00:17:42,250 این ایده که هر فرایند، هر برنامه ای که بر روی کامپیوتر شما در حال اجرا است 211 00:17:42,250 --> 00:17:49,450 خود را دارد - اجازه دهید فرض 32 بیت - کاملا مستقل فضای آدرس. 212 00:17:49,450 --> 00:17:51,590 این فضای آدرس دهی است. 213 00:17:51,590 --> 00:17:56,220 این به خود را دارد کاملا مستقل 4 گیگابایت برای استفاده است. 214 00:17:56,220 --> 00:18:02,220 >> بنابراین اگر شما 2 برنامه به طور همزمان، این برنامه 4 گیگابایت را به خود می بیند. 215 00:18:02,220 --> 00:18:04,870 این برنامه 4 گیگابایت را به خود می بیند. 216 00:18:04,870 --> 00:18:07,720 و آن را برای این برنامه غیر ممکن به dereference یک اشاره گر 217 00:18:07,720 --> 00:18:10,920 و در نهایت حافظه از این برنامه است. 218 00:18:10,920 --> 00:18:18,200 و چه در حافظه مجازی است، نقشه برداری از فضای آدرس فرآیندهای 219 00:18:18,200 --> 00:18:20,470 به چیزهای واقعی بر روی RAM. 220 00:18:20,470 --> 00:18:22,940 پس آن را به سیستم عامل شما می دانید که، 221 00:18:22,940 --> 00:18:28,080 با سلام، در زمانی که این مرد ارجاع میدهد oxbfff اشاره گر، که واقعا به معنای 222 00:18:28,080 --> 00:18:31,040 که او می خواهد RAM BYTE 1000، 223 00:18:31,040 --> 00:18:38,150 در حالی که اگر این برنامه oxbfff ارجاع میدهد، او واقعا می خواهد RAM BYTE 10،000. 224 00:18:38,150 --> 00:18:41,590 آنها می توانند خودسرانه دور از هم. 225 00:18:41,590 --> 00:18:48,730 این درست است که حتی از چیزهایی که در یک فضای آدرس فرآیندهای تک. 226 00:18:48,730 --> 00:18:54,770 پس چون آن را می بیند تمام 4 گیگابایت را به خود، اما اجازه دهید بگویم - 227 00:18:54,770 --> 00:18:57,290 [دانشجوی] هر پروسه - 228 00:18:57,290 --> 00:19:01,350 بیایید می گویند شما باید یک کامپیوتر با تنها 4 گیگابایت RAM است. 229 00:19:01,350 --> 00:19:06,430 آیا هر پروسه در کل از 4 گیگابایت؟ >> بله. 230 00:19:06,430 --> 00:19:13,060 اما از 4 گیگابایت آن را می بیند یک دروغ است. 231 00:19:13,060 --> 00:19:20,460 این فقط به آن فکر می کند این همه این حافظه به دلیل آن را نمی داند هر فرایند دیگر وجود دارد. 232 00:19:20,460 --> 00:19:28,140 این تنها حافظه به همان اندازه که آن را در واقع باید استفاده کنید. 233 00:19:28,140 --> 00:19:32,340 سیستم عامل نمی خواهید به RAM به این فرآیند 234 00:19:32,340 --> 00:19:35,750 اگر آن را از هر حافظه در تمام این منطقه را با استفاده از. 235 00:19:35,750 --> 00:19:39,300 این قصد ندارم به آن حافظه را برای آن منطقه را. 236 00:19:39,300 --> 00:19:54,780 اما این ایده که - من در تلاش برای فکر می کنم از - من نمی توانم فکر می کنم از قیاس است. 237 00:19:54,780 --> 00:19:56,780 شباهتها سخت است. 238 00:19:57,740 --> 00:20:02,700 یکی از مسائل مربوط به حافظه مجازی یا یکی از چیزهایی که آن را حل 239 00:20:02,700 --> 00:20:06,810 این است که فرایندهای باید به طور کامل از یکدیگر غافل است. 240 00:20:06,810 --> 00:20:12,140 و بنابراین شما می توانید هر برنامه ای نوشت که فقط ارجاع میدهد هر اشاره گر، 241 00:20:12,140 --> 00:20:19,340 دوست دارم فقط به نوشتن یک برنامه که می گوید * (ox1234)، 242 00:20:19,340 --> 00:20:22,890 بصورت غیر مرجع و آدرس حافظه 1234. 243 00:20:22,890 --> 00:20:28,870 >> اما آن را به سیستم عامل به آن چه 1234 به معنی ترجمه است. 244 00:20:28,870 --> 00:20:33,960 بنابراین اگر 1234 اتفاق می افتد که یک آدرس حافظه معتبر برای این فرایند، 245 00:20:33,960 --> 00:20:38,800 مانند آن را در پشته و یا چیزی است، سپس این مقدار از حافظه است که آدرس بازگشت 246 00:20:38,800 --> 00:20:41,960 تا آنجا که این روند می داند. 247 00:20:41,960 --> 00:20:47,520 اما اگر 1234 یک آدرس معتبر نمی باشد، مانند آن اتفاق می افتد به زمین 248 00:20:47,520 --> 00:20:52,910 در برخی قطعه کمی از حافظه در اینجا این است که فراتر از پشته و فراتر از پشته 249 00:20:52,910 --> 00:20:57,200 و شما واقعا استفاده می شود که، پس از آن که زمانی که شما می توانید چیزهایی مانند segfaults 250 00:20:57,200 --> 00:21:00,260 دلیل این که شما در حال لمس کردن حافظه است که شما نباید لمس کردن است. 251 00:21:07,180 --> 00:21:09,340 این هم درست است - 252 00:21:09,340 --> 00:21:15,440 یک سیستم 32 بیتی، 32 بیت معنی است که شما برای تعریف یک آدرس حافظه 32 بیت می باشد. 253 00:21:15,440 --> 00:21:22,970 به همین دلیل است اشاره گر 8 بایت به خاطر 32 بیت 8 بایت - یا 4 کلمه در ادامه متن. 254 00:21:22,970 --> 00:21:25,250 اشاره گرها 4 بایت است. 255 00:21:25,250 --> 00:21:33,680 بنابراین، هنگامی که شما یک اشاره گر مانند oxbfffff است که - 256 00:21:33,680 --> 00:21:40,080 در هر برنامه داده شده شما می توانید فقط هر اشاره گر دلخواه ساخت، 257 00:21:40,080 --> 00:21:46,330 در هر نقطه از ox0 به گاو نر 8 f's - ffffffff. 258 00:21:46,330 --> 00:21:49,180 [دانشجو] آیا شما می گویند که 4 بایت است؟ >> آره. 259 00:21:49,180 --> 00:21:52,730 [دانشجو] سپس هر بایت - >> [Bowden] هگزادسیمال. 260 00:21:52,730 --> 00:21:59,360 هگزادسیمال - 5، 6، 7، 8. پس اشاره گر شما تا همیشه در مبنای شانزده را ببینید. 261 00:21:59,360 --> 00:22:01,710 این فقط اشاره گر ما طبقه بندی. 262 00:22:01,710 --> 00:22:05,240 هر 2 رقم هگزادسیمال 1 بایت است. 263 00:22:05,240 --> 00:22:09,600 بنابراین قصد دارد به 8 رقم هگزادسیمال برای 4 بایت است. 264 00:22:09,600 --> 00:22:14,190 بنابراین هر اشاره گر بر روی یک سیستم 32 بیتی برای رفتن به 4 بایت، 265 00:22:14,190 --> 00:22:18,550 که بدان معنی است که در روند خود را، شما می توانید هر 4 خودسرانه بایت ساخت 266 00:22:18,550 --> 00:22:20,550 و یک اشاره گر از آن، 267 00:22:20,550 --> 00:22:32,730 که بدان معنی است که تا آنجا که آن را به عنوان آگاه، می تواند و 2 کل 32 بایت از حافظه آدرس. 268 00:22:32,730 --> 00:22:34,760 حتی اگر آن را واقعا نمی دسترسی به آن، 269 00:22:34,760 --> 00:22:40,190 حتی اگر کامپیوتر شما تنها دارای 512 مگابایت، فکر می کند آن است که حافظه زیادی است. 270 00:22:40,190 --> 00:22:44,930 و سیستم عامل به اندازه کافی هوشمند است که آن را تنها اختصاص آنچه شما در واقع نیاز است. 271 00:22:44,930 --> 00:22:49,630 این کار نه تنها بروید، آه، یک فرآیند جدید: 4 گیگابایت است. 272 00:22:49,630 --> 00:22:51,930 >> آره. >> [دانشجو] چه گاو؟ چرا که شما آن را بنویسید؟ 273 00:22:51,930 --> 00:22:54,980 این فقط نماد هگزادسیمال. 274 00:22:54,980 --> 00:22:59,590 وقتی که شما شروع به شماره با گاو نر، همه چیز های پی در پی هگزادسیمال است. 275 00:23:01,930 --> 00:23:05,760 [دانشجو] از شما در مورد آنچه اتفاق می افتد زمانی که برنامه به پایان می رسد توضیح شد. >> بله. 276 00:23:05,760 --> 00:23:09,480 چه اتفاقی می افتد زمانی که برنامه به پایان می رسد سیستم عامل است 277 00:23:09,480 --> 00:23:13,600 فقط پاکسازی نگاشت که آن را برای این آدرس ها است، و این از آن است. 278 00:23:13,600 --> 00:23:17,770 سیستم عامل هم اکنون می توانید این حافظه به یک برنامه دیگر برای استفاده به من بدهید. 279 00:23:17,770 --> 00:23:19,490 [دانشجو] خوب. 280 00:23:19,490 --> 00:23:24,800 بنابراین، هنگامی که شما تخصیص چیزی در پشته و یا متغیرهای پشته و یا جهانی و یا هر چیز، 281 00:23:24,800 --> 00:23:27,010 همه آنها را فقط به عنوان به زودی ناپدید می شوند به عنوان برنامه به پایان می رسد 282 00:23:27,010 --> 00:23:32,120 به این دلیل که سیستم عامل در حال حاضر آزاد را که حافظه را به هر فرآیند دیگر. 283 00:23:32,120 --> 00:23:35,150 [دانشجو] اگرچه احتمالا هنوز مقادیر نوشته شده در؟ >> آره. 284 00:23:35,150 --> 00:23:37,740 ارزش ها به احتمال زیاد هنوز هم وجود دارد. 285 00:23:37,740 --> 00:23:41,570 این فقط آن را به دشوار در آنها را دریافت کنید. 286 00:23:41,570 --> 00:23:45,230 این بسیار سخت تر آنها را دریافت کنید، از آن است که در یک فایل حذف شده 287 00:23:45,230 --> 00:23:51,450 زیرا نوع فایل حذف شده از نشسته وجود دارد برای یک مدت طولانی و هارد دیسک خیلی بزرگتر است. 288 00:23:51,450 --> 00:23:54,120 پس از آن رفتن به بازنویسی قسمت های مختلف حافظه 289 00:23:54,120 --> 00:23:58,640 قبل از آن اتفاق می افتد به بازنویسی تکه از حافظه است که که فایل استفاده می شود در. 290 00:23:58,640 --> 00:24:04,520 اما حافظه اصلی، RAM، شما را از طریق خیلی سریع تر چرخه، 291 00:24:04,520 --> 00:24:08,040 پس از آن رفتن به بسیار به سرعت در حال بازنویسی است. 292 00:24:10,300 --> 00:24:13,340 سوالات مطرح شده در این و یا هر چیز دیگری؟ 293 00:24:13,340 --> 00:24:16,130 [دانشجوی] سوال در مورد یک موضوع متفاوت است. >> درست است. 294 00:24:16,130 --> 00:24:19,060 آیا کسی سوال در مورد این؟ 295 00:24:20,170 --> 00:24:23,120 >> باشه. موضوع های مختلف. >> [دانشجو] باشه. 296 00:24:23,120 --> 00:24:26,550 من را از طریق برخی از آزمون عملی خواهد شد، 297 00:24:26,550 --> 00:24:30,480 و در یکی از آنها صحبت کردن در مورد sizeof شد 298 00:24:30,480 --> 00:24:35,630 و ارزش است که آن را برمی گرداند و یا انواع مختلف متغیر است. >> بله. 299 00:24:35,630 --> 00:24:45,060 و گفت که هر دو نوع int و بلند مدت هر دو بازگشت 4، به طوری که آنها هر دو 4 بایت طول هستیم. 300 00:24:45,060 --> 00:24:48,070 آیا تفاوت بین int و طولانی، وجود دارد و یا این همان چیزی است؟ 301 00:24:48,070 --> 00:24:50,380 بله، تفاوت وجود دارد. 302 00:24:50,380 --> 00:24:52,960 استاندارد C - 303 00:24:52,960 --> 00:24:54,950 شاید هم من دارم رفتن به یک ظرف غذا تا. 304 00:24:54,950 --> 00:24:58,800 استاندارد C است فقط آنچه C این است که، اسناد رسمی C. دوست 305 00:24:58,800 --> 00:25:00,340 این همان چیزی است که آن را می گوید. 306 00:25:00,340 --> 00:25:08,650 بنابراین استاندارد C فقط می گوید که یک کاراکتر برای همیشه و همیشه خواهد بود 1 بایت است. 307 00:25:10,470 --> 00:25:19,040 همه چیز بعد از آن - کوتاه است که همیشه فقط به عنوان بزرگتر یا مساوی به یک کاراکتر تعریف شده است. 308 00:25:19,040 --> 00:25:23,010 این ممکن است به شدت بیشتر از، اما مثبت نیست. 309 00:25:23,010 --> 00:25:31,940 بین المللی است که فقط به عنوان بزرگتر یا مساوی به کوتاه تعریف شده است. 310 00:25:31,940 --> 00:25:36,210 و بلند است که فقط به عنوان بزرگتر یا مساوی به یک int تعریف شده است. 311 00:25:36,210 --> 00:25:41,600 و طولانی مدت است بزرگتر یا مساوی به طولانی است. 312 00:25:41,600 --> 00:25:46,610 بنابراین تنها چیزی که استاندارد C تعریف نظم نسبی از همه چیز است. 313 00:25:46,610 --> 00:25:54,880 مقدار واقعی حافظه است که همه چیز را تا به طور کلی برای پیاده سازی، 314 00:25:54,880 --> 00:25:57,640 اما آن را به خوبی در این نقطه تعریف می شود. >> [دانشجو] باشه. 315 00:25:57,640 --> 00:26:02,490 بنابراین شلوارک تقریبا همیشه رفتن به 2 بایت است. 316 00:26:04,920 --> 00:26:09,950 نوع داده int هستند تقریبا همیشه به 4 بایت است. 317 00:26:12,070 --> 00:26:15,340 موقعیت خرید پیش میآید طول تقریبا همیشه به 8 بایت است. 318 00:26:17,990 --> 00:26:23,160 و مشتاق، در مورد اینکه آیا شما با استفاده از 32 بیتی یا یک سیستم 64 بیتی دارد. 319 00:26:23,160 --> 00:26:27,450 بنابراین طولانی است مربوط به نوع سیستم. 320 00:26:27,450 --> 00:26:31,920 اگر شما با استفاده از یک سیستم 32 بیتی مانند دستگاه، آن را به 4 بایت است. 321 00:26:34,530 --> 00:26:42,570 اگر شما با استفاده از 64 بیتی مانند بسیاری از رایانه های اخیر، آن را به 8 بایت است. 322 00:26:42,570 --> 00:26:45,230 >> نوع داده int هستند تقریبا همیشه 4 بایت در این نقطه است. 323 00:26:45,230 --> 00:26:47,140 موقعیت خرید پیش میآید طول تقریبا همیشه 8 بایت است. 324 00:26:47,140 --> 00:26:50,300 در گذشته، نوع داده int استفاده می شود تنها به 2 بایت است. 325 00:26:50,300 --> 00:26:56,840 اما توجه کنید که این به طور کامل ارضا تمام این روابط بیش از و برابر. 326 00:26:56,840 --> 00:27:01,280 تا زمانی کاملا اجازه داده می شود به همان اندازه به عنوان یک عدد صحیح، 327 00:27:01,280 --> 00:27:04,030 و آن را نیز اجازه داده می شود به همان اندازه به عنوان طولانی مدت است. 328 00:27:04,030 --> 00:27:11,070 و این فقط اتفاق می افتد که در 99.999٪ از سیستم، آن را در حال رفتن به برابر 329 00:27:11,070 --> 00:27:15,800 یا بین المللی و یا طولانی مدت است. این فقط بر روی 32 بیتی یا 64 بیتی بستگی دارد. >> [دانشجو] باشه. 330 00:27:15,800 --> 00:27:24,600 در شناور، چگونه است که نقطه اعشار تعیین شده در قوانین و مقررات از بیت؟ 331 00:27:24,600 --> 00:27:27,160 مانند دودویی؟ >> آره. 332 00:27:27,160 --> 00:27:30,570 شما لازم نیست بدانند که برای CS50. 333 00:27:30,570 --> 00:27:32,960 شما حتی نمی یاد بگیرند که در 61. 334 00:27:32,960 --> 00:27:37,350 شما را نمی آموزند که واقعا در هر دوره است. 335 00:27:37,350 --> 00:27:42,740 این فقط یک نمایش است. 336 00:27:42,740 --> 00:27:45,440 من را فراموش کرده ام سهمیه کمی دقیق. 337 00:27:45,440 --> 00:27:53,380 این ایده از نقطه شناور این است که شما به اختصاص یک شماره خاص از بیت برای نشان دادن - 338 00:27:53,380 --> 00:27:56,550 در واقع، همه چیز در نماد علمی است. 339 00:27:56,550 --> 00:28:05,600 بنابراین شما تخصیص یک شماره خاص از بیت برای نشان دادن شماره خود، مانند 1.2345. 340 00:28:05,600 --> 00:28:10,200 من می توانم یک عدد را با رقم بیش از 5 نمایندگی هرگز. 341 00:28:12,200 --> 00:28:26,300 سپس شما نیز اختصاص یک شماره خاص از بیت ها به طوری که این امر منجر به مانند 342 00:28:26,300 --> 00:28:32,810 شما تنها می توانید به یک شماره خاص، می خواهم که بزرگترین نمایی شما می توانید، 343 00:28:32,810 --> 00:28:36,190 و شما تنها می توانید به یک نماینده خاص بروید، 344 00:28:36,190 --> 00:28:38,770 دوست دارم که کوچکترین نمایی شما می توانید. 345 00:28:38,770 --> 00:28:44,410 >> من را به خاطر نمی بیت راه دقیق به تمام این ارزش ها اختصاص داده شده، 346 00:28:44,410 --> 00:28:47,940 اما تعداد معینی از بیت اختصاص داده شده، به 1.2345 347 00:28:47,940 --> 00:28:50,930 یکی دیگر از تعداد مشخصی بیت اختصاص داده شده، به توان 348 00:28:50,930 --> 00:28:55,670 و آن را تنها راه ممکن برای نشان دادن نمایی از یک اندازه خاص است. 349 00:28:55,670 --> 00:29:01,100 [دانش آموز] و دو برابر؟ است که مانند شناور طولانی اضافی؟ >> آره. 350 00:29:01,100 --> 00:29:07,940 این همان چیزی که به عنوان شناور به جز در حال حاضر شما در حال استفاده از 8 بایت به جای آن از 4 بایت است. 351 00:29:07,940 --> 00:29:11,960 حالا شما قادر خواهید بود به استفاده از 9 رقم یا 10 رقم 352 00:29:11,960 --> 00:29:16,630 و این خواهد بود که قادر به رفتن تا 300 به جای 100. >> [دانشجو] باشه. 353 00:29:16,630 --> 00:29:21,550 و شناور نیز 4 بایت است. >> بله. 354 00:29:21,550 --> 00:29:27,520 خوب، دوباره، آن را احتمالا بستگی دارد به طور کلی در اجرای عمومی، 355 00:29:27,520 --> 00:29:30,610 اما شناور 4 بایت هستند، دو برابر 8. 356 00:29:30,610 --> 00:29:33,440 دو برابر نامیده می شوند دو برابر است زیرا آنها دو برابر اندازه شناور است. 357 00:29:33,440 --> 00:29:38,380 [دانشجو] خوب. و وجود دارد دو برابر دو برابر است؟ >> وجود ندارد. 358 00:29:38,380 --> 00:29:43,660 من فکر می کنم - >> [دانشجو] مانند موقعیت خرید پیش میآید بلند؟ >> آره. گمان نمی کنم. بله. 359 00:29:43,660 --> 00:29:45,950 [دانشجو در آزمون سال گذشته بود یک سوال در مورد تابع اصلی وجود دارد 360 00:29:45,950 --> 00:29:49,490 نیاز به بخشی از برنامه های خود را. 361 00:29:49,490 --> 00:29:52,310 پاسخ این بود که آن را ندارد بخشی از برنامه های خود را به. 362 00:29:52,310 --> 00:29:55,100 در چه وضعیت؟ این چیزی است که من تو را دیدم. 363 00:29:55,100 --> 00:29:59,090 [Bowden] به نظر می رسد - >> [دانشجو] وضعیت چیست؟ 364 00:29:59,090 --> 00:30:02,880 آیا مشکل دارید؟ >> [دانشجوی] آره، من قطعا می توانید آن را بالا بکشد. 365 00:30:02,880 --> 00:30:07,910 این کار می شود، از لحاظ فنی، اما اساسا از آن برای رفتن به. 366 00:30:07,910 --> 00:30:10,030 [دانشجو] من یکی در سال های مختلف را دیدم. 367 00:30:10,030 --> 00:30:16,220 مانند درست یا غلط بود: معتبر - >> اوه، یک فایل C.؟ 368 00:30:16,220 --> 00:30:18,790 [دانشجو] هر فایل C باید - [هر دو زبان در یک بار - ناخوانا] 369 00:30:18,790 --> 00:30:21,120 باشه. به طوری که برنامه جداگانه. 370 00:30:21,120 --> 00:30:26,800 >> یک فایل C فقط نیاز به توابع شامل است. 371 00:30:26,800 --> 00:30:32,400 شما می توانید یک فایل را به کد ماشین، باینری، هر آنچه که کامپایل، 372 00:30:32,400 --> 00:30:36,620 بدون این که اجرایی نشده است. 373 00:30:36,620 --> 00:30:39,420 اجرایی معتبر باید یک تابع اصلی داشته باشد. 374 00:30:39,420 --> 00:30:45,460 شما می توانید از 100 توابع در 1 فایل اما هیچ اصلی ارسال 375 00:30:45,460 --> 00:30:48,800 و پس از آن را به باینری کامپایل، 376 00:30:48,800 --> 00:30:54,460 پس از آن تو می نویسم یکی دیگر از فایل است که تنها اصلی است اما در آن خواستار یک دسته از این توابع 377 00:30:54,460 --> 00:30:56,720 در این فایل باینری در اینجا. 378 00:30:56,720 --> 00:31:01,240 و تا زمانی که شما در حال اجرایی، این چیزی است که لینکر می کند 379 00:31:01,240 --> 00:31:05,960 است که آن را ترکیبی از این 2 فایل های باینری را در یک فایل اجرایی می باشد. 380 00:31:05,960 --> 00:31:11,400 بنابراین یک فایل C لازم نیست که یک تابع اصلی در تمام. 381 00:31:11,400 --> 00:31:19,220 و در پایگاه های بزرگ کد شما هزاران نفر از فایل های C و 1 فایل اصلی را ببینید. 382 00:31:23,960 --> 00:31:26,110 بیشتر است؟ 383 00:31:29,310 --> 00:31:31,940 [دانشجو] یک سؤال دیگر وجود دارد. 384 00:31:31,940 --> 00:31:36,710 گفت: ساخت این است که یک کامپایلر است. درست یا غلط؟ 385 00:31:36,710 --> 00:31:42,030 و پاسخ غلط بود، و فهمیدم که چرا آن را مانند صدای جرنگ جرنگ نیست. 386 00:31:42,030 --> 00:31:44,770 اما چه چیزی ما تماس بگیرید اگر این طور نیست؟ 387 00:31:44,770 --> 00:31:49,990 را اساسا فقط - من می توانید ببینید که دقیقا همان چیزی است که آن را. 388 00:31:49,990 --> 00:31:52,410 اما این فقط دستورات را اجرا می کند. 389 00:31:53,650 --> 00:31:55,650 را تشکیل می دهند. 390 00:31:58,240 --> 00:32:00,870 من می توانم از این بالا بکشید. آره. 391 00:32:10,110 --> 00:32:13,180 اوه، آره. را نیز ندارد که. 392 00:32:13,180 --> 00:32:17,170 این ماده می گوید هدف از ابزار را به طور خودکار تعیین 393 00:32:17,170 --> 00:32:19,610 که قطعه از یک برنامه بزرگ نیاز به کامپایل مجدد 394 00:32:19,610 --> 00:32:22,350 و صدور دستورات به کامپایل مجدد آنها. 395 00:32:22,350 --> 00:32:27,690 شما می توانید فایل هایی که کاملا بزرگ است. 396 00:32:27,690 --> 00:32:33,210 اطمینان به نظر می رسد در زمان تمبر از فایل ها و مانند قبل از ما گفت، 397 00:32:33,210 --> 00:32:36,930 شما می توانید فایل ها را کامپایل، و آن را تا زمانی که شما به لینکر 398 00:32:36,930 --> 00:32:39,270 که آنها با هم به یک فایل اجرایی قرار داده است. 399 00:32:39,270 --> 00:32:43,810 بنابراین اگر شما 10 فایل های مختلف و شما می توانید تغییرات تا 1، از آنها، 400 00:32:43,810 --> 00:32:47,870 پس از آن چه ایجاد شده است برای انجام این کار فقط کامپایل است که 1 فایل 401 00:32:47,870 --> 00:32:50,640 و پس از آن همه چیز با هم relink. 402 00:32:50,640 --> 00:32:53,020 اما آن را بسیار دمپر از آن است. 403 00:32:53,020 --> 00:32:55,690 آن تا به شما به طور کامل تعریف که این چیزی است که باید آن را انجام. 404 00:32:55,690 --> 00:32:59,560 آن را به طور پیش فرض است که توانایی به رسمیت شناختن این زمان چیزهای مهر، 405 00:32:59,560 --> 00:33:03,220 اما شما می توانید یک فایل را به انجام هر چیزی نوشتن. 406 00:33:03,220 --> 00:33:09,150 شما می توانید ارسال نامه را در فایل به طوری که زمانی که شما تایپ آن را فقط سی دی را به شاخه دیگری. 407 00:33:09,150 --> 00:33:15,560 قرار گرفت و برای بار دوم من گرفتن نا امید شد، چرا که من همه چیز رویه در داخل از لوازم من 408 00:33:15,560 --> 00:33:21,740 و پس از آن PDF از مک من ها را ببینید. 409 00:33:21,740 --> 00:33:30,720 >> بنابراین من به یاب و من می توانم آیا، اتصال به سرور، 410 00:33:30,720 --> 00:33:36,950 و سرور من برای اتصال لوازم خانگی من است و پس از آن من باز کردن PDF 411 00:33:36,950 --> 00:33:40,190 که می شود توسط لاتکس وارد شده است. 412 00:33:40,190 --> 00:33:49,320 اما من گرفتن نا امید بود زیرا هر زمان تنها من نیاز به به روز کردن PDF، 413 00:33:49,320 --> 00:33:53,900 من تا به حال آن را کپی کنید به یک پوشه خاص است که می تواند دسترسی به 414 00:33:53,900 --> 00:33:57,710 و آن را آزار دهنده است. 415 00:33:57,710 --> 00:34:02,650 بنابراین به جای من یک فایل ساخت، که شما باید برای تعریف چگونگی آن را می سازد همه چیز را نوشت. 416 00:34:02,650 --> 00:34:06,130 چگونه شما را در ایجاد این PDF لاتکس است. 417 00:34:06,130 --> 00:34:10,090 درست مثل هر فایل ایجاد دیگر - یا من حدس می زنم شما از فایل دیده می کنند، 418 00:34:10,090 --> 00:34:13,510 اما ما در این دستگاه که یک فایل ایجاد جهانی است که می گوید، 419 00:34:13,510 --> 00:34:16,679 اگر شما در حال کامپایل یک فایل C، استفاده از صدای جرنگ جرنگ. 420 00:34:16,679 --> 00:34:20,960 و بنابراین در اینجا در فایل ایجاد من است که من را من می گویم، 421 00:34:20,960 --> 00:34:25,020 این فایل شما می خواهید به با PDF لاتکس کامپایل. 422 00:34:25,020 --> 00:34:27,889 و پس از آن لاتکس PDF که انجام گردآوری شده است. 423 00:34:27,889 --> 00:34:31,880 را کامپایل نیست. این فقط در حال اجرا این دستورات در دنباله من مشخص است. 424 00:34:31,880 --> 00:34:36,110 پس از آن اجرا می شود لاتکس PDF، آن را به شاخه ای را که می خواهید آن را به کپی به کپی، 425 00:34:36,110 --> 00:34:38,270 آن سی دی به دایرکتوری و چیزهای دیگر را می کند، 426 00:34:38,270 --> 00:34:42,380 اما همه آن کند تشخیص تغییرات فایل، 427 00:34:42,380 --> 00:34:45,489 و اگر تغییر، سپس آن را به دستورات آن است که قرار است به اجرا اجرا 428 00:34:45,489 --> 00:34:48,760 هنگامی که تغییرات فایل. >> [دانشجو] باشه. 429 00:34:50,510 --> 00:34:54,420 من نمی دانم که در آن فایل ایجاد جهانی برای من آن را به اتمام. 430 00:34:57,210 --> 00:35:04,290 سوال دیگر؟ هر چیزی از گذشته آزمونها؟ هر چیز اشاره گر؟ 431 00:35:06,200 --> 00:35:08,730 چیزهایی هستند که ظریف با اشاره گرها مانند وجود دارد - 432 00:35:08,730 --> 00:35:10,220 من نخواهد بود قادر به پیدا کردن یک سوال مسابقه بر روی آن - 433 00:35:10,220 --> 00:35:16,250 اما درست مانند این نوع از چیزی است. 434 00:35:19,680 --> 00:35:24,060 اطمینان حاصل کنید که شما را در درک که زمانی که من می گویم هوشمند * X * Y - 435 00:35:24,890 --> 00:35:28,130 این دقیقا هر چیزی در اینجا نیست، من حدس می زنم. 436 00:35:28,130 --> 00:35:32,140 اما مانند * X * Y، هستند کسانی که 2 متغیر است که بر روی پشته هستند. 437 00:35:32,140 --> 00:35:37,220 وقتی که من می گویم X = malloc (sizeof (INT))، x است که هنوز هم یک متغیر را بر روی پشته، 438 00:35:37,220 --> 00:35:41,180 malloc برخی از بلوک در پشته است، و ما در حال داشتن نقطه X به پشته. 439 00:35:41,180 --> 00:35:43,900 >> بنابراین چیزی در نقاط پشته پشته. 440 00:35:43,900 --> 00:35:48,100 هر زمان که شما malloc هر چیزی، شما به ناچار در نگهداری آن را داخل یک اشاره گر است. 441 00:35:48,100 --> 00:35:55,940 به طوری که اشاره گر را بر روی پشته، بلوک malloced در پشته. 442 00:35:55,940 --> 00:36:01,240 بسیاری از مردم به اشتباه گرفته و می گویند از نوع int * x = malloc X در پشته است. 443 00:36:01,240 --> 00:36:04,100 شماره X اشاره به پشته می باشد. 444 00:36:04,100 --> 00:36:08,540 X خود را بر روی پشته، مگر اینکه به هر دلیلی شما X یک متغیر جهانی، 445 00:36:08,540 --> 00:36:11,960 که در این حالت اتفاق می افتد که در منطقه دیگری از حافظه است. 446 00:36:13,450 --> 00:36:20,820 بنابراین برای نگه داشتن مسیر، این نمودار جعبه و فلش بسیار رایج برای مسابقه است. 447 00:36:20,820 --> 00:36:25,740 یا اگر آن را در مسابقه 0 نیست، اما در مسابقه 1. 448 00:36:27,570 --> 00:36:31,940 شما باید همه از این می دانم که گام در تدوین 449 00:36:31,940 --> 00:36:35,740 از آنجایی که شما تا به حال برای پاسخ به سوال در مورد کسانی است. بله. 450 00:36:35,740 --> 00:36:38,940 [دانشجو] آیا ما بیش از آن مراحل - >> مطمئنا. 451 00:36:48,340 --> 00:36:58,640 قبل از مراحل و تدوین پیش پردازش، 452 00:36:58,640 --> 00:37:16,750 تدوین، مونتاژ، و ارتباط است. 453 00:37:16,750 --> 00:37:21,480 پیش پردازش. چه کاری انجام دهید؟ 454 00:37:29,720 --> 00:37:32,290 این ساده ترین مرحله است - خب، نه مثل - 455 00:37:32,290 --> 00:37:35,770 این بدان معنا نیست که باید آن را واضح و آشکار باشد، اما این ساده ترین مرحله است. 456 00:37:35,770 --> 00:37:38,410 شما بچه ها می توانند خود را اجرا می کنند. آره. 457 00:37:38,410 --> 00:37:43,410 [دانشجو] نگاهی به آنچه شما را در خود داشته باشد شامل مثل این و آن را کپی و پس از آن نیز تعریف می کند. 458 00:37:43,410 --> 00:37:49,250 برای چیزهایی همانند # include به نظر می رسد و # تعریف، 459 00:37:49,250 --> 00:37:53,800 و آن را فقط کپی و چسب آنچه که در واقع متوسط. 460 00:37:53,800 --> 00:37:59,240 بنابراین، هنگامی که به شما می گویند # شامل cs50.h، پردازنده کپی کردن و چسباندن cs50.h 461 00:37:59,240 --> 00:38:01,030 به آن خط است. 462 00:38:01,030 --> 00:38:06,640 هنگامی که به شما می گویند: تعریف X به 4، پیش پردازنده می رود از طریق این برنامه کل 463 00:38:06,640 --> 00:38:10,400 و جایگزین همه موارد از X با 4. 464 00:38:10,400 --> 00:38:17,530 بنابراین پیش پردازنده می گیرد یک فایل C معتبر و خروجی یک فایل معتبر C 465 00:38:17,530 --> 00:38:20,300 که در آن همه چیز را کپی و جا به جا شده است. 466 00:38:20,300 --> 00:38:24,230 بنابراین در حال حاضر تدوین است. چه کاری انجام دهید؟ 467 00:38:25,940 --> 00:38:28,210 [دانشجو] آن را از C به باینری می رود. 468 00:38:28,210 --> 00:38:30,970 >> [Bowden] این همه راه را به باینری نیست. 469 00:38:30,970 --> 00:38:34,220 [دانشجو] به کد ماشین؟ >> کد ماشین نیست. 470 00:38:34,220 --> 00:38:35,700 [دانشجوی] مجمع؟ >> مجمع. 471 00:38:35,700 --> 00:38:38,890 آن را به مجلس می رود قبل از آن می رود تمام راه را به کد C، 472 00:38:38,890 --> 00:38:45,010 و بسیاری از زبان ها چیزی شبیه به این. 473 00:38:47,740 --> 00:38:50,590 انتخاب هر زبان سطح بالا است، و اگر شما در حال رفتن به آن را کامپایل، 474 00:38:50,590 --> 00:38:52,390 این احتمال وجود دارد که در مراحل تدوین است. 475 00:38:52,390 --> 00:38:58,140 اول رفتن به کامپایل پایتون به C، سپس آن را به کامپایل C به مجمع، 476 00:38:58,140 --> 00:39:01,600 و پس از آن مجمع به باینری ترجمه شده است. 477 00:39:01,600 --> 00:39:07,800 بنابراین تدوین است که رفتن به آن را از C به مجمع. 478 00:39:07,800 --> 00:39:12,130 کلمه تدوین معمولا به معنای آوردن آن از یک سطح بالاتر 479 00:39:12,130 --> 00:39:14,340 به یک زبان برنامه نویسی سطح پایین تر. 480 00:39:14,340 --> 00:39:19,190 بنابراین در این مرحله تنها در تلفیقی که در آن شما را با یک زبان سطح بالا شروع است 481 00:39:19,190 --> 00:39:23,270 و در نهایت در یک زبان سطح پایین است، و به همین دلیل است که مرحله تدوین است. 482 00:39:25,280 --> 00:39:33,370 [دانشجو] در طول تدوین، اجازه دهید بگویم که شما انجام داده ایم # شامل cs50.h. 483 00:39:33,370 --> 00:39:42,190 به کامپایلر کامپایل مجدد cs50.h، مانند توابع که در آن وجود دارد، 484 00:39:42,190 --> 00:39:45,280 و ترجمه به کد اسمبلی به عنوان خوب، 485 00:39:45,280 --> 00:39:50,830 و یا آن را کپی کنید و آن چیزی است که پیش مونتاژ شده است؟ 486 00:39:50,830 --> 00:39:56,910 cs50.h خیلی خیلی هرگز تا پایان در مجمع است. 487 00:39:59,740 --> 00:40:03,680 چیزهای مانند نمونه تابع و همه چیز فقط برای شما مراقب باشید. 488 00:40:03,680 --> 00:40:09,270 این تضمین می کند که کامپایلر می تواند چیزهایی مانند شما در حال فراخوانی توابع چک 489 00:40:09,270 --> 00:40:12,910 انواع بازگشت راست و استدلال راست و مسائل است. 490 00:40:12,910 --> 00:40:18,350 >> بنابراین cs50.h خواهد شد را در فایل preprocessed، و سپس هنگامی که آن را تدوین 491 00:40:18,350 --> 00:40:22,310 اساسا دور انداخته و پس از آن باعث می شود اطمینان حاصل کنید که همه چیز به درستی است که به نام. 492 00:40:22,310 --> 00:40:29,410 اما توابع تعریف شده در کتابخانه CS50، که جدا از cs50.h، 493 00:40:29,410 --> 00:40:33,610 کسانی که نمی شود به طور جداگانه وارد شده. 494 00:40:33,610 --> 00:40:37,270 که در واقع پایین خواهد آمد در مرحله ارتباط است، بنابراین ما در یک ثانیه بدست آورید. 495 00:40:37,270 --> 00:40:40,100 اما در ابتدا، آنچه که مونتاژ؟ 496 00:40:41,850 --> 00:40:44,500 [دانشجوی] مجمع به باینری؟ >> آره. 497 00:40:46,300 --> 00:40:48,190 مونتاژ. 498 00:40:48,190 --> 00:40:54,710 ما را صدا نمی آن تدوین به دلیل مجمع است که تقریبا یک ترجمه خالص دودویی. 499 00:40:54,710 --> 00:41:00,230 منطق بسیار کوچک در رفتن از مجلس به باینری وجود دارد. 500 00:41:00,230 --> 00:41:03,180 این درست مثل دنبال کردن یک جدول، آه، ما باید این دستور؛ 501 00:41:03,180 --> 00:41:06,290 که مربوط به باینری 01،110. 502 00:41:10,200 --> 00:41:15,230 و به این ترتیب فایل هایی که مونتاژ به طور کلی خروجی فایل های O. 503 00:41:15,230 --> 00:41:19,020 و فایل های O همان چیزی است که ما می گفتند قبل از، 504 00:41:19,020 --> 00:41:21,570 چگونه یک فایل لازم نیست که به یک تابع اصلی. 505 00:41:21,570 --> 00:41:27,640 هر فایل را می توان تا زمانی آن را به عنوان یک فایل C معتبر به یک فایل O وارد شده است. 506 00:41:27,640 --> 00:41:30,300 این را می توان به ای وارد شده است. 507 00:41:30,300 --> 00:41:43,030 در حال حاضر، ارتباط آن چیزی است که در واقع به ارمغان می آورد یک دسته از فایل ها O به ارمغان می آورد و آنها را به یک فایل اجرایی است. 508 00:41:43,030 --> 00:41:51,110 و به این ترتیب ارتباط می کند این است که شما می توانید از کتابخانه CS50 به عنوان یک فایل O فکر می کنم. 509 00:41:51,110 --> 00:41:56,980 این یک فایل باینری در حال حاضر وارد شده است. 510 00:41:56,980 --> 00:42:03,530 و بنابراین، هنگامی که فایل خود را، hello.c خود را، که خواستار GetString شما کامپایل، 511 00:42:03,530 --> 00:42:06,360 hello.c می شود به hello.o وارد شده، 512 00:42:06,360 --> 00:42:08,910 hello.o است که در حال حاضر در دودویی. 513 00:42:08,910 --> 00:42:12,830 آن استفاده می کند GetString، پس از آن نیاز به رفتن به cs50.o، 514 00:42:12,830 --> 00:42:16,390 و لینکر آنها را با هم smooshes و GetString را در این فایل کپی 515 00:42:16,390 --> 00:42:20,640 بیرون می آید و با اجرایی است که تمام توابع به آن نیاز دارد. 516 00:42:20,640 --> 00:42:32,620 بنابراین cs50.o است که در واقع یک فایل O، اما آن را به اندازه کافی نزدیک است که هیچ تفاوت اساسی وجود دارد. 517 00:42:32,620 --> 00:42:36,880 بنابراین ارتباط فقط یک دسته از فایل ها را با هم به ارمغان می آورد 518 00:42:36,880 --> 00:42:41,390 که به طور جداگانه شامل تمام توابع، نیاز به استفاده از 519 00:42:41,390 --> 00:42:46,120 و ایجاد اجرایی است که در واقع اجرا خواهد شد. 520 00:42:48,420 --> 00:42:50,780 >> و به طوری که آنچه که ما می گفتند قبل از 521 00:42:50,780 --> 00:42:55,970 که در آن شما می توانید 1000. فایل های C، همه آنها را به شما کامپایل. فایل های O، 522 00:42:55,970 --> 00:43:00,040 که احتمالا مدتی طول خواهد کشید، و سپس شما تغییر 1. فایل C است. 523 00:43:00,040 --> 00:43:05,480 شما فقط نیاز به کامپایل مجدد که 1 فایل C و پس از آن همه چیز relink دیگری، 524 00:43:05,480 --> 00:43:07,690 لینک کنید همه چیز با هم. 525 00:43:09,580 --> 00:43:11,430 [دانشجو] هنگامی که ما در حال ارتباط ما ارسال lcs50؟ 526 00:43:11,430 --> 00:43:20,510 آره، پس lcs50. که سیگنال پرچم به لینکر که شما باید ارتباط را در آن کتابخانه است. 527 00:43:26,680 --> 00:43:28,910 پرسش و پاسخ؟ 528 00:43:41,310 --> 00:43:46,860 آیا ما بیش از دودویی به غیر از آن است که 5 ثانیه در سخنرانی اول رفته است؟ 529 00:43:50,130 --> 00:43:53,010 گمان نمی کنم. 530 00:43:55,530 --> 00:43:58,820 شما باید از سیستم عامل های بزرگ که ما رفته است می دانم، 531 00:43:58,820 --> 00:44:02,670 و شما باید قادر باشد که، اگر ما به شما یک تابع، 532 00:44:02,670 --> 00:44:09,410 شما باید قادر به گفتن آن بزرگ O، تقریبا. یا خوب، بزرگ O خشن است. 533 00:44:09,410 --> 00:44:15,300 بنابراین اگر شما برای حلقه حلقه بیش به همان تعداد از همه چیز تو در تو، 534 00:44:15,300 --> 00:44:22,260 برای مثال، int من، > [دانشجوی] N مربع. >> این امر منجر به N مربع است. 535 00:44:22,260 --> 00:44:25,280 اگر شما سه گانه را تو در تو، این امر منجر به N نبات. 536 00:44:25,280 --> 00:44:29,330 به طوری که مرتب سازی بر اساس چیزی که شما باید قادر باشد که به این نکته اشاره بلافاصله. 537 00:44:29,330 --> 00:44:33,890 شما باید بدانید که مرتب سازی بر درج و مرتب سازی حبابی و ادغام مرتب کردن و همه کسانی. 538 00:44:33,890 --> 00:44:41,420 آن را آسان تر به درک چرا آنها کسانی هستند N مربع و n log n است و همه از آن 539 00:44:41,420 --> 00:44:47,810 چرا که من فکر می کنم در مسابقه وجود دارد یک سال که ما اساسا به شما داد 540 00:44:47,810 --> 00:44:55,050 اجرای مرتب سازی بر حباب و گفت: "زمان در حال اجرا از این تابع چیست؟" 541 00:44:55,050 --> 00:45:01,020 بنابراین اگر شما آن را تشخیص عنوان مرتب سازی بر اساس حباب، و سپس شما می توانید بلافاصله N مربع می گویند. 542 00:45:01,020 --> 00:45:05,470 اما اگر شما فقط به آن نگاه کنید، شما حتی نمی نیاز به مرتب سازی بر حباب آن به درک؛ 543 00:45:05,470 --> 00:45:08,990 شما می توانید فقط این است که انجام این کار و این می گویند. این است که نفر مربع است. 544 00:45:12,350 --> 00:45:14,710 [دانشجو] آیا نمونه های دشوار شما می توانید با، 545 00:45:14,710 --> 00:45:20,370 مانند یک ایده مشابه از بدانند؟ 546 00:45:20,370 --> 00:45:24,450 >> من فکر نمی کنم ما می خواهیم به شما هیچکدام از نمونه های سخت به من بدهید. 547 00:45:24,450 --> 00:45:30,180 حباب مرتب کردن بر اساس چیزی که در مورد سخت است که ما را به 548 00:45:30,180 --> 00:45:36,280 و حتی، تا زمانی که شما را در درک که شما تکرار بیش از آرایه 549 00:45:36,280 --> 00:45:41,670 برای هر عنصر در آرایه، که به چیزی است که نفر مربع است. 550 00:45:45,370 --> 00:45:49,940 پرسش ها، به طور کلی مانند حق در اینجا در حال حاضر وجود دارد - آه. 551 00:45:55,290 --> 00:45:58,530 فقط روز دیگر، داگ ادعا کرد، "من اختراع یک الگوریتم است که می تواند یک آرایه مرتب سازی بر اساس 552 00:45:58,530 --> 00:46:01,780 "از تعداد N در O (log n است) زمان!" 553 00:46:01,780 --> 00:46:04,900 پس چگونه ما می دانیم که غیر ممکن است؟ 554 00:46:04,900 --> 00:46:08,850 [پاسخ دانش آموز نامفهوم] >> آره. 555 00:46:08,850 --> 00:46:13,710 حداقل، شما باید به لمس هر عنصر در آرایه، 556 00:46:13,710 --> 00:46:16,210 پس از آن غیر ممکن است برای مرتب کردن یک آرایه - 557 00:46:16,210 --> 00:46:20,850 اگر همه چیز است به منظور نامرتب، پس از آن شما برای رفتن به لمس کردن همه چیز را در آرایه، 558 00:46:20,850 --> 00:46:25,320 پس از آن غیر ممکن است که آن را در کمتر از O از N. 559 00:46:27,430 --> 00:46:30,340 [دانشجو] شما به ما نشان داد که به عنوان مثال قادر به انجام آن در O از N 560 00:46:30,340 --> 00:46:33,920 اگر شما با استفاده از مقدار زیادی از حافظه است. >> آره. 561 00:46:33,920 --> 00:46:37,970 و that's - من فراموش that's - آیا مرتب سازی بر اساس شمارش؟ 562 00:46:47,360 --> 00:46:51,330 سلام. این یک الگوریتم مرتب سازی عدد صحیح است. 563 00:46:59,850 --> 00:47:05,100 من دنبال نام خاصی برای این بود که من نمی توانستم به یاد داشته باشید در هفته گذشته است. 564 00:47:05,100 --> 00:47:13,000 آره. این نوع از انواع است که می تواند همه چیز را در بزرگ O از N انجام است. 565 00:47:13,000 --> 00:47:18,430 اما محدودیت وجود دارد، مثل شما فقط می توانید با استفاده از اعداد صحیح به یک شماره خاص است. 566 00:47:20,870 --> 00:47:24,560 به علاوه اگر شما در حال تلاش برای مرتب کردن that's چیزی - 567 00:47:24,560 --> 00:47:30,750 اگر آرایه خود را 012 -12، 151، 4 میلیون نفر است، 568 00:47:30,750 --> 00:47:35,120 سپس آن عنصر واحد به طور کامل خراب مرتب سازی کل است. 569 00:47:42,060 --> 00:47:44,030 >> پرسش و پاسخ؟ 570 00:47:49,480 --> 00:47:58,870 [دانشجو] اگر شما از یک تابع بازگشتی و فقط باعث می شود که تماس های بازگشتی 571 00:47:58,870 --> 00:48:02,230 در بیانیه ای بازگشت، که دم بازگشتی، 572 00:48:02,230 --> 00:48:07,360 و به طوری که نه استفاده از حافظه بیشتر در زمان اجرا 573 00:48:07,360 --> 00:48:12,550 یا حداقل استفاده از حافظه های قابل مقایسه به عنوان یک تکرار شونده راه حل؟ 574 00:48:12,550 --> 00:48:14,530 [Bowden] بله. 575 00:48:14,530 --> 00:48:19,840 به احتمال زیاد تا حدودی کندتر باشد، اما نه واقعا. 576 00:48:19,840 --> 00:48:23,290 دم بازگشتی خوب است. 577 00:48:23,290 --> 00:48:32,640 به دنبال دوباره در قاب پشته، اجازه دهید می گویند ما باید اصلی 578 00:48:32,640 --> 00:48:42,920 و ما باید نوار هوشمند (از نوع int x) و یا چیزی است. 579 00:48:42,920 --> 00:48:52,310 این تابع بازگشتی کامل نیست، اما نوار بازگشت (X - 1). 580 00:48:52,310 --> 00:48:57,620 پس بدیهی است، این ناقص است. شما نیاز به موارد و مسائل پایه. 581 00:48:57,620 --> 00:49:00,360 اما این ایده در اینجا این است که این دم بازگشتی، 582 00:49:00,360 --> 00:49:06,020 معنی که وقتی نوار تماس های اصلی آن را به قاب پشته آن است. 583 00:49:09,550 --> 00:49:12,440 در این قاب پشته وجود دارد که بلوک کمی از حافظه 584 00:49:12,440 --> 00:49:17,490 که مربوط به آرگومان x است. 585 00:49:17,490 --> 00:49:25,840 و بنابراین، اجازه دهید می گویند اصلی این اتفاق می افتد به نوار تماس (100)؛ 586 00:49:25,840 --> 00:49:30,050 پس X در حال رفتن به شروع کردن به عنوان 100. 587 00:49:30,050 --> 00:49:35,660 اگر کامپایلر به رسمیت می شناسد که این است که یک تابع بازگشتی دم، 588 00:49:35,660 --> 00:49:38,540 سپس وقتی که نوار باعث می شود تماس بازگشتی خود را به نوار، 589 00:49:38,540 --> 00:49:45,490 به جای ساخت یک قاب پشته جدید، است که که در آن پشته شروع می شود تا حد زیادی در حال رشد، 590 00:49:45,490 --> 00:49:48,220 در نهایت آن را به پشته اجرا شود و پس از آن segfaults شما می توانید 591 00:49:48,220 --> 00:49:51,590 زیرا حافظه شروع می شود برخورد. 592 00:49:51,590 --> 00:49:54,830 >> بنابراین به جای ساخت قاب پشته خود را، می تواند به درک، 593 00:49:54,830 --> 00:49:59,080 با سلام، من واقعا هرگز نیاز به دوباره به این قاب پشته، 594 00:49:59,080 --> 00:50:08,040 بنابراین به جای من فقط این استدلال با 99 و جایگزین سپس شروع به نوار بیش از همه. 595 00:50:08,040 --> 00:50:11,810 و سپس آن را دوباره آن را انجام دهد و آن را به نوار بازگشت برسد (X - 1)، 596 00:50:11,810 --> 00:50:17,320 و به جای ساخت یک قاب پشته جدید، آن را فقط به بحث کنونی خود را با 98 جایگزین 597 00:50:17,320 --> 00:50:20,740 و پس از آن به ابتدای نوار پرش. 598 00:50:23,860 --> 00:50:30,430 این عملیات، جایگزینی است که مقدار 1 را بر روی پشته و پریدن بازگشت به آغاز، 599 00:50:30,430 --> 00:50:32,430 بسیار کارآمد است. 600 00:50:32,430 --> 00:50:41,500 بنابراین نه تنها این است که استفاده از حافظه به عنوان یک تابع جداگانه است که تکرار شونده 601 00:50:41,500 --> 00:50:45,390 زیرا شما تنها با استفاده از 1 پشته قاب، اما شما در حال جنبه های منفی رنج می برند نه 602 00:50:45,390 --> 00:50:47,240 نیاز به فراخوانی توابع. 603 00:50:47,240 --> 00:50:50,240 فراخوانی توابع می توانند تا حدودی گران است چرا که آن را برای انجام تمام این تنظیمات 604 00:50:50,240 --> 00:50:52,470 و tearDown و همه این مسائل است. 605 00:50:52,470 --> 00:50:58,160 پس این بازگشت دم خوب است. 606 00:50:58,160 --> 00:51:01,170 [دانشجوی] چرا از آن مراحل جدید ایجاد کنید؟ 607 00:51:01,170 --> 00:51:02,980 از آنجا که آن را متوجه آن نیاز ندارد. 608 00:51:02,980 --> 00:51:07,800 تماس را در نوار تماس بازگشتی بازگشت. 609 00:51:07,800 --> 00:51:12,220 پس از آن نیازی به انجام هر کاری با مقدار بازگشتی. 610 00:51:12,220 --> 00:51:15,120 این فقط می خواهد که فورا آن را بازگشت. 611 00:51:15,120 --> 00:51:20,530 پس از آن فقط به جای استدلال خاص خود را دارد و بیش از شروع. 612 00:51:20,530 --> 00:51:25,780 و همچنین، اگر شما از نسخه دم بازگشتی نداشته باشند، 613 00:51:25,780 --> 00:51:31,460 سپس شما می توانید تمام این میله که در آن در زمانی که این نوار را برمی گرداند 614 00:51:31,460 --> 00:51:36,010 برای بازگشت به ارزش های خود را به این یکی، پس از آن که نوار بلافاصله برمی گرداند 615 00:51:36,010 --> 00:51:39,620 و آن را می گرداند ارزش خود را به این یکی، و سپس آن را فقط رفتن برای برگرداندن 616 00:51:39,620 --> 00:51:41,350 و بازگشت ارزش خود را به این یکی. 617 00:51:41,350 --> 00:51:45,350 بنابراین شما در حال صرفه جویی در ظاهر تمام این چیزها را از پشته 618 00:51:45,350 --> 00:51:48,730 از آنجا که مقدار بازگشتی برای رفتن به گذشت تمام راه برگشت تا به هر حال. 619 00:51:48,730 --> 00:51:55,400 پس چرا نه تنها جایگزین استدلال خود را با این استدلال به روز شده و شروع به بیش از؟ 620 00:51:57,460 --> 00:52:01,150 اگر تابع دم بازگشتی نیست، اگر شما چیزی شبیه به - 621 00:52:01,150 --> 00:52:07,530 [دانشجو] اگر نوار (x + 1). >> آره. 622 00:52:07,530 --> 00:52:11,770 >> بنابراین اگر شما آن را در وضعیت قرار داده است، پس از آن شما در حال انجام چیزی با ارزش بازگشت. 623 00:52:11,770 --> 00:52:16,260 یا حتی اگر شما فقط بازگشت 2 * نوار (x - 1). 624 00:52:16,260 --> 00:52:23,560 بنابراین در حال حاضر نوار (X - 1) نیاز به منظور بازگشت به آن برای محاسبه 2 بار که ارزش، 625 00:52:23,560 --> 00:52:26,140 بنابراین در حال حاضر آن را نشانی از نیاز خود را در قاب پشته جداگانه، 626 00:52:26,140 --> 00:52:31,180 و در حال حاضر، مهم نیست چقدر سخت شما سعی می کنید، شما نیاز به رفتن به - 627 00:52:31,180 --> 00:52:34,410 این دم نه بازگشتی است. 628 00:52:34,410 --> 00:52:37,590 [دانشجو] آیا من سعی می کنم بازگشت را به بازگشت دنباله هدف - 629 00:52:37,590 --> 00:52:41,450 [Bowden] در یک دنیای ایده آل، اما در CS50 شما ندارد. 630 00:52:43,780 --> 00:52:49,280 به منظور بدست آوردن بازگشت دم، به طور کلی، شما راه اندازی یک آرگومان اضافی 631 00:52:49,280 --> 00:52:53,550 که در آن نوار نوع int X به Y را 632 00:52:53,550 --> 00:52:56,990 و y مربوط به نهایی چیزی که شما می خواهید به بازگشت. 633 00:52:56,990 --> 00:53:03,650 بنابراین پس از این کار شما در حال رفتن به نوار (X - 1) 2 * Y است. 634 00:53:03,650 --> 00:53:09,810 به طوری که فقط یک سطح بالا چگونه شما تبدیل همه چیز به دم بازگشتی. 635 00:53:09,810 --> 00:53:13,790 اما این استدلال اضافی - 636 00:53:13,790 --> 00:53:17,410 و سپس در پایان هنگامی که شما در رسیدن به حالت پایه خود را، شما فقط Y بازگشت 637 00:53:17,410 --> 00:53:22,740 چون شما جمع آوری شده است، تمام مدت مقدار بازگشتی که شما می خواهید. 638 00:53:22,740 --> 00:53:27,280 شما از نوع آن را انجام می دهند تکراری اما با استفاده از تماس های بازگشتی است. 639 00:53:32,510 --> 00:53:34,900 پرسش و پاسخ؟ 640 00:53:34,900 --> 00:53:39,890 [دانش آموز] شاید در مورد ریاضی اشاره گر، مانند هنگام استفاده از رشته ها است. >> مطمئنا. 641 00:53:39,890 --> 00:53:43,610 ریاضی اشاره گر است. 642 00:53:43,610 --> 00:53:48,440 هنگام استفاده از رشته ها از آن آسان است، چرا که رشته ها ستاره کاراکتر، 643 00:53:48,440 --> 00:53:51,860 کاراکتر برای همیشه و همیشه تنها یک بایت، 644 00:53:51,860 --> 00:53:57,540 و ریاضی اشاره گر معادل به حساب منظم در هنگامی که شما در حال برخورد با رشته است. 645 00:53:57,540 --> 00:54:08,790 بیایید فقط کاراکتر * S = "سلام" می گویند. 646 00:54:08,790 --> 00:54:11,430 بنابراین ما باید یک بلوک در حافظه است. 647 00:54:19,490 --> 00:54:22,380 این نیاز به 6 بایت آنجا که شما همیشه نیاز به نابودگر تهی. 648 00:54:22,380 --> 00:54:28,620 و char * s به نقطه شروع این آرایه است. 649 00:54:28,620 --> 00:54:32,830 بنابراین نکات وجود دارد. 650 00:54:32,830 --> 00:54:36,710 در حال حاضر، این است که اساسا هر آرایه چگونه کار می کند، 651 00:54:36,710 --> 00:54:40,780 صرف نظر از اینکه آن را بازگشت malloc یا اینکه آیا آن را بر روی پشته بود. 652 00:54:40,780 --> 00:54:47,110 هر آرایه اساسا یک اشاره گر به شروع آرایه، 653 00:54:47,110 --> 00:54:53,640 و پس از آن هر گونه عملیات آرایه، هر نمایه سازی، فقط به آن آرایه خاصی افست. 654 00:54:53,640 --> 00:55:05,360 >> بنابراین، وقتی که من می گویند چیزی شبیه به [3]؛ این است که رفتن به و شمارش 3 کاراکتر وارد 655 00:55:05,360 --> 00:55:12,490 بنابراین [3]، ما باید 0، 1، 2، 3، بنابراین [3] برای اشاره به این ل. 656 00:55:12,490 --> 00:55:20,460 [دانشجو] و ما می توانیم همان مقدار با انجام S + 3 و سپس ستاره پرانتز برسد؟ 657 00:55:20,460 --> 00:55:22,570 بله. 658 00:55:22,570 --> 00:55:26,010 این است که معادل * (+ 3)؛ 659 00:55:26,010 --> 00:55:31,240 و این است که برای همیشه و همیشه معادل آن بدون توجه به آنچه که شما انجام می دهند. 660 00:55:31,240 --> 00:55:34,070 شما هرگز نیاز به استفاده از نحو براکت. 661 00:55:34,070 --> 00:55:37,770 شما همیشه می توانید * (+ 3) نحو استفاده کنید. 662 00:55:37,770 --> 00:55:40,180 مردم تمایل دارند به مانند نحو براکت، هر چند. 663 00:55:40,180 --> 00:55:43,860 [دانشجو] بنابراین، همه آرایه ها در واقع فقط به اشاره گر. 664 00:55:43,860 --> 00:55:53,630 است که تفاوت اندکی وجود دارد وقتی که من می گویند اعضای هیات X [4]؛ >> [دانشجو] که ایجاد حافظه؟ 665 00:55:53,630 --> 00:56:03,320 [Bowden] است که رفتن به 4 نوع داده int در پشته، به طوری که 16 بایت به طور کلی است. 666 00:56:03,320 --> 00:56:05,700 رفتن به 16 کلمه در ادامه متن بر روی پشته. 667 00:56:05,700 --> 00:56:09,190 X ذخیره شده است به جایی نمی. 668 00:56:09,190 --> 00:56:13,420 این فقط یک نماد با اشاره به آغاز از چیزی است. 669 00:56:13,420 --> 00:56:17,680 از آنجا که شما در داخل این تابع آرایه اعلام کرد 670 00:56:17,680 --> 00:56:22,340 آنچه که کامپایلر به انجام همه موارد متغیر x جایگزین 671 00:56:22,340 --> 00:56:26,400 که در آن اتفاق افتاده است را انتخاب کنید برای قرار دادن این 16 بایت است. 672 00:56:26,400 --> 00:56:30,040 این می تواند که با کاراکتر * را انجام ندهید زیرا اشاره گر واقعی است. 673 00:56:30,040 --> 00:56:32,380 سپس به چیزهای دیگر آن آزاد است. 674 00:56:32,380 --> 00:56:36,140 X ثابت است. شما نمی توانید آن را به یک آرایه های مختلف نقطه. >> [دانشجو] باشه. 675 00:56:36,140 --> 00:56:43,420 اما این ایده، این نمایه سازی، همان است که صرف نظر از اینکه آن را در یک آرایه سنتی 676 00:56:43,420 --> 00:56:48,230 یا اگر آن را در یک اشاره گر به چیزی و یا اگر آن را به یک اشاره گر به یک آرایه malloced است. 677 00:56:48,230 --> 00:56:59,770 و در واقع، آن است که معادل است که همان چیزی. 678 00:56:59,770 --> 00:57:05,440 در واقع فقط ترجمه آنچه در داخل براکت و چه از براکت سمت چپ، 679 00:57:05,440 --> 00:57:07,970 اضافه می کند آنها را با هم، و ارجاع میدهد. 680 00:57:07,970 --> 00:57:14,710 بنابراین این فقط به عنوان به عنوان معتبر * (+ 3) یا S [3]. 681 00:57:16,210 --> 00:57:22,090 [دانشجو] آیا می توانم اشاره گر با اشاره به آرایه های 2 بعدی به شما داشته باشد؟ 682 00:57:22,090 --> 00:57:27,380 >> آن سخت تر است. به طور سنتی، نه. 683 00:57:27,380 --> 00:57:34,720 آرایه 2 بعدی است فقط یک آرایه 1 بعدی با برخی از نحو مناسب 684 00:57:34,720 --> 00:57:54,110 زیرا وقتی که من می گویند اعضای هیات X [3] [3]، این است که واقعا فقط 1 مجموعه ای با 9 ارزش است. 685 00:57:55,500 --> 00:58:03,000 و تا زمانی که من شاخص، کامپایلر می داند منظورم چیست. 686 00:58:03,000 --> 00:58:13,090 اگر من می گویم X [1] [2]، می داند که من می خواهم برای رفتن به سطر دوم، پس از آن رفتن به صفحه 3 نخست 687 00:58:13,090 --> 00:58:17,460 و سپس آن را می خواهد نکته دوم که در آن، پس از آن با رفتن به این یکی. 688 00:58:17,460 --> 00:58:20,480 اما این هنوز فقط یک آرایه تک بعدی است. 689 00:58:20,480 --> 00:58:23,660 و بنابراین اگر من می خواستم یک اشاره گر به آرایه ای که به او واگذار، 690 00:58:23,660 --> 00:58:29,770 من می خواهم بگویم از نوع int * p = X. 691 00:58:29,770 --> 00:58:33,220 نوع X - 692 00:58:33,220 --> 00:58:38,280 این نوع خشن گفت: از X را از آن فقط یک نماد است و آن را در یک متغیر واقعی نیست، 693 00:58:38,280 --> 00:58:40,140 اما این تنها * نوع int است. 694 00:58:40,140 --> 00:58:44,840 X فقط یک اشاره گر به شروع این است. >> [دانشجو] باشه. 695 00:58:44,840 --> 00:58:52,560 و بنابراین من نمی قادر خواهد بود برای دسترسی به [1] [2]. 696 00:58:52,560 --> 00:58:58,370 من فکر می کنم نحو خاص برای تعریف یک اشاره گر وجود دارد، 697 00:58:58,370 --> 00:59:12,480 چیزی مسخره مانند نوع int (* P [- چیزی کاملا مضحک من حتی نمی دانند. 698 00:59:12,480 --> 00:59:17,090 اما یک نحو برای تعریف اشاره گرها مانند با پرانتز و همه چیز وجود دارد. 699 00:59:17,090 --> 00:59:22,960 حتی ممکن است به شما اجازه انجام این کار است. 700 00:59:22,960 --> 00:59:26,640 من می توانم به عقب نگاه چیزی که من حقیقت را بگو. 701 00:59:26,640 --> 00:59:34,160 من برای آن نگاه کنید بعد از آن، اگر به نحو برای نقطه وجود دارد. اما شما آن را هرگز. 702 00:59:34,160 --> 00:59:39,670 و حتی به نحو کهنه است به طوری که اگر شما از آن استفاده کنید، مردم خواهد بود گیج است. 703 00:59:39,670 --> 00:59:43,540 آرایه های چند بعدی بسیار نادر هستند به عنوان آن است. 704 00:59:43,540 --> 00:59:44,630 شما بسیار - 705 00:59:44,630 --> 00:59:48,490 خوب، اگر شما در حال انجام کارهایی ماتریس آن را نمی خواهید به نادر، 706 00:59:48,490 --> 00:59:56,730 اما در C شما به ندرت می شود با استفاده از آرایه های چند بعدی. 707 00:59:57,630 --> 01:00:00,470 آره. >> [دانشجو] بیایید می گویند شما باید یک آرایه واقعا طولانی است. 708 01:00:00,470 --> 01:00:03,900 >> بنابراین در حافظه مجازی، به نظر می رسد به همه پشت سر هم، 709 01:00:03,900 --> 01:00:05,640 مانند عناصر درست در کنار یکدیگر، 710 01:00:05,640 --> 01:00:08,770 اما در حافظه فیزیکی، آن را ممکن است برای آن که این تقسیم کردن؟ >> بله. 711 01:00:08,770 --> 01:00:16,860 چگونه با این نسخهها کار مجازی حافظه آن است که تنها جدا - 712 01:00:19,220 --> 01:00:24,860 واحد تخصیص یک صفحه، که تمایل به 4 کیلوبایت است، 713 01:00:24,860 --> 01:00:29,680 و بنابراین، هنگامی که یک فرایند می گوید، با سلام، من می خواهم به استفاده از این حافظه، 714 01:00:29,680 --> 01:00:35,970 سیستم عامل آن را به 4 کیلوبایت است که بلوک های کمی از حافظه را تخصیص. 715 01:00:35,970 --> 01:00:39,100 حتی اگر شما تنها یک بایت کمی تنها در تمام بلوک از حافظه استفاده کنید، 716 01:00:39,100 --> 01:00:42,850 سیستم عامل آن را به 4 کامل کیلوبایت. 717 01:00:42,850 --> 01:00:49,410 بنابراین این بدان معنی است من می توانستم - بیایید می گویند این است که پشته من. 718 01:00:49,410 --> 01:00:53,180 این پشته می تواند از هم جدا شوند. پشته من می تواند مگابایت و مگابایت. 719 01:00:53,180 --> 01:00:55,020 پشته من می تواند بزرگ باشد. 720 01:00:55,020 --> 01:01:00,220 اما پشته خود را به صفحات خاص تقسیم می شود، 721 01:01:00,220 --> 01:01:09,010 که اگر ما در اینجا نگاه کنید اجازه دهید می گویند این است که RAM ماست، 722 01:01:09,010 --> 01:01:16,600 اگر من دارای 2 گیگابایت RAM، 0 آدرس واقعی مانند 0 بایت از RAM من است، 723 01:01:16,600 --> 01:01:22,210 و این 2 گیگابایت تمام راه را در اینجا می باشد. 724 01:01:22,210 --> 01:01:27,230 پس این صفحه ممکن است به این بلوک در اینجا مطابقت داشته باشد. 725 01:01:27,230 --> 01:01:29,400 این صفحه ممکن است به این بلوک در اینجا مطابقت داشته باشد. 726 01:01:29,400 --> 01:01:31,560 این یکی ممکن است به این یکی در اینجا مطابقت دارد. 727 01:01:31,560 --> 01:01:35,540 بنابراین سیستم عامل رایگان است برای اختصاص حافظه فیزیکی 728 01:01:35,540 --> 01:01:39,320 به هر صفحه ای فردی را خودسرانه. 729 01:01:39,320 --> 01:01:46,180 و این بدان معنی است که اگر این مرز اتفاق می افتد را به گشاد گشاد راه رفتن یک آرایه، 730 01:01:46,180 --> 01:01:50,070 آرایه ای اتفاق می افتد از این به چپ و راست به این منظور از یک صفحه، 731 01:01:50,070 --> 01:01:54,460 پس از آن که آرایه در حافظه فیزیکی تقسیم می شود. 732 01:01:54,460 --> 01:01:59,280 و پس از آن زمانی که شما ترک این برنامه، وقتی که این فرایند به پایان می رسد، 733 01:01:59,280 --> 01:02:05,690 این نگاشت دریافت پاک می شود و سپس آن را برای استفاده از این بلوک های کوچک برای چیزهای دیگر. 734 01:02:14,730 --> 01:02:17,410 بیشتر است؟ 735 01:02:17,410 --> 01:02:19,960 [دانشجو] ریاضی اشاره گر. >> اوه آره. 736 01:02:19,960 --> 01:02:28,410 رشته آسان تر بود، اما به دنبال چیزی شبیه به نوع داده int، 737 01:02:28,410 --> 01:02:35,000 بنابراین به نوع int X [4]؛ 738 01:02:35,000 --> 01:02:41,810 آیا این یک آرایه یا اینکه آیا این یک اشاره گر به یک آرایه از 4 عدد صحیح malloced، 739 01:02:41,810 --> 01:02:47,060 آن را به همان شیوه به درمان می شود. 740 01:02:50,590 --> 01:02:53,340 [دانشجو] آرایه در پشته هستند؟ 741 01:03:01,400 --> 01:03:05,270 [Bowden] آرایه ها در پشته. >> [دانشجو] آه. 742 01:03:05,270 --> 01:03:08,320 >> [Bowden] این نوع از آرایه تمایل دارد در پشته 743 01:03:08,320 --> 01:03:12,220 مگر اینکه شما آن را اعلام کرد - نادیده گرفتن متغیر های جهانی است. متغیر های جهانی استفاده نمی کند. 744 01:03:12,220 --> 01:03:16,280 در داخل یک تابع من می گویم اعضای هیات X [4]؛ 745 01:03:16,280 --> 01:03:22,520 رفتن به ایجاد یک بلوک 4 عدد صحیح را بر روی پشته برای این آرایه است. 746 01:03:22,520 --> 01:03:26,960 اما این malloc (4 * sizeof (هوشمند))؛ رفتن به پشته. 747 01:03:26,960 --> 01:03:31,870 اما بعد از این مرحله من می تواند x و P در خیلی راه همان استفاده کنید، 748 01:03:31,870 --> 01:03:36,140 غیر از استثنا من گفت: قبل از اینکه در مورد شما می توانید P جابهجا. 749 01:03:36,140 --> 01:03:40,960 با مشخصات فنی، اندازه آنها تا حدودی متفاوت است، اما این کاملا بی ربط است. 750 01:03:40,960 --> 01:03:43,310 شما در واقع هرگز به استفاده از اندازه آنها است. 751 01:03:48,020 --> 01:03:56,810 P من می توانم بگویم P [3] = 2؛ یا X [3] = 2؛ 752 01:03:56,810 --> 01:03:59,680 شما می توانید آنها را دقیقا در همان راه استفاده کنید. 753 01:03:59,680 --> 01:04:01,570 پس حسابی اشاره گر کن - بله. 754 01:04:01,570 --> 01:04:07,390 [دانشجو] آیا شما باید به انجام * P در صورتی که دارای براکت؟ 755 01:04:07,390 --> 01:04:11,720 براکت dereference ضمنی است. >> درست است. 756 01:04:11,720 --> 01:04:20,200 در واقع، آنچه که شما در حال گفت: با می توانید آرایه های چند بعدی شما می توانید 757 01:04:20,200 --> 01:05:02,650 با اشاره گر، چیزی شبیه به آنچه که شما می توانید انجام دهید این است، بیایید می گویند، اعضای هیات ** PP = malloc (sizeof (هوشمند) * 5)؛ 758 01:05:02,650 --> 01:05:06,900 من فقط آن را از اول بنویسید. 759 01:05:37,880 --> 01:05:41,020 من که یکی را نمی خواهم. 760 01:05:41,020 --> 01:05:42,550 باشه. 761 01:05:42,550 --> 01:05:48,910 چیزی که من در اینجا این است - که باید PP های [i]. 762 01:05:48,910 --> 01:05:53,680 بنابراین PP، یک اشاره گر به اشاره گر است. 763 01:05:53,680 --> 01:06:02,420 شما در حال mallocing PP به نقطه را به یک آرایه از 5 ستاره از نوع int است. 764 01:06:02,420 --> 01:06:10,950 بنابراین در حافظه شما در صفحات پشته 765 01:06:10,950 --> 01:06:20,150 رفتن به نقطه را به یک آرایه از 5 بلوک است که همه خود اشاره گر. 766 01:06:20,150 --> 01:06:28,210 و پس از آن زمانی که من malloc را در اینجا، من malloc است که هر یک از آن اشاره گرها فردی 767 01:06:28,210 --> 01:06:32,080 باید نقطه به یک بلوک جداگانه از 4 کلمه در ادامه متن بر روی پشته. 768 01:06:32,080 --> 01:06:35,870 بنابراین این نقاط تا 4 بایت است. 769 01:06:37,940 --> 01:06:40,660 و این یکی از نقاط مختلف به 4 بایت است. 770 01:06:40,660 --> 01:06:43,200 >> و همه آنها را به خود 4 بایت است. 771 01:06:43,200 --> 01:06:49,080 این به من راه انجام کارها چند بعدی است. 772 01:06:49,080 --> 01:06:58,030 من می توانم PP [3] [4]، اما در حال حاضر این است که همان چیزی که به عنوان آرایه های چند بعدی می گویند 773 01:06:58,030 --> 01:07:05,390 چرا که آرایه های چند بعدی آن را ترجمه شده [3] [4] به یک افست در آرایه X است. 774 01:07:05,390 --> 01:07:14,790 این P ارجاع میدهد، دسترسی به شاخص سوم، و سپس ارجاع میدهد که 775 01:07:14,790 --> 01:07:20,790 و دسترسی - 4 نامعتبر - شاخص دوم است. 776 01:07:24,770 --> 01:07:31,430 در حالی که زمانی که ما تا به حال از INT X [3] [4] قبل از به عنوان یک آرایه چند بعدی 777 01:07:31,430 --> 01:07:35,740 و هنگامی که قلاب شما به دو برابر آن را واقعا تنها dereference تنها، 778 01:07:35,740 --> 01:07:40,490 شما تنها یک اشاره گر را دنبال و پس از آن جبران، 779 01:07:40,490 --> 01:07:42,850 این است که واقعا منابع 2D. 780 01:07:42,850 --> 01:07:45,840 شما به دنبال 2 اشاره گر جداگانه. 781 01:07:45,840 --> 01:07:50,420 بنابراین این امر به لحاظ تکنیکی نیز اجازه می دهد تا شما را به آرایه های چند بعدی 782 01:07:50,420 --> 01:07:53,550 که در آن هر یک از آرایه های فردی در اندازه های مختلف است. 783 01:07:53,550 --> 01:07:58,000 بنابراین من فکر می کنم دندانه دار آرایه های چند بعدی همان چیزی است که آن را به نام 784 01:07:58,000 --> 01:08:01,870 از آنجا که اولین چیزی که واقعا می تواند به چیزی است که دارای 10 عنصر اشاره، 785 01:08:01,870 --> 01:08:05,540 دومین چیزی که می تواند به چیزی است که 100 عنصر. 786 01:08:05,540 --> 01:08:10,790 [دانشجو] آیا محدودیتی وجود دارد به تعدادی از اشاره گرها شما می توانید 787 01:08:10,790 --> 01:08:14,290 با اشاره به اشاره گر دیگر؟ >> شماره 788 01:08:14,290 --> 01:08:17,010 شما می توانید نوع int ***** P. 789 01:08:18,050 --> 01:08:23,760 بازگشت به محاسباتی اشاره گر - >> [دانشجو] آه. >> آره. 790 01:08:23,760 --> 01:08:35,649 [دانشجو] اگر من از نوع int *** P و سپس من غیر مرجع و من می گویم * P برابر این مقدار است، 791 01:08:35,649 --> 01:08:39,560 آن را تنها به 1 درجه از غیر مرجع؟ >> بله. 792 01:08:39,560 --> 01:08:43,340 پس اگر من می خواهم برای دسترسی به چیزی که اشاره گر گذشته است با اشاره به در - 793 01:08:43,340 --> 01:08:46,210 سپس شما P ***. >> درست است. 794 01:08:46,210 --> 01:08:54,080 بنابراین این نقاط P تا 1، بلوک، امتیاز خود را به دیگری بلوک، امتیاز خود را به دیگری بلوک. 795 01:08:54,080 --> 01:09:02,010 اگر شما * p = چیز دیگری، و سپس شما در حال تغییر در این 796 01:09:02,010 --> 01:09:13,640 در حال حاضر به یک بلوک های مختلف. >> درست است. 797 01:09:13,640 --> 01:09:17,649 >> [Bowden] و اگر این malloced، و سپس شما در حال حاضر به بیرون درز حافظه 798 01:09:17,649 --> 01:09:20,430 مگر اینکه شما اتفاق می افتد را به منابع مختلف از این 799 01:09:20,430 --> 01:09:25,270 از شما نمی تواند به عقب بر گردیم به کسانی که آنهایی که شما فقط به دور انداخت. 800 01:09:25,270 --> 01:09:29,550 ریاضی اشاره گر است. 801 01:09:29,550 --> 01:09:36,310 اعضای هیات X [4]؛ رفتن به تخصیص یک آرایه از 4 عدد صحیح 802 01:09:36,310 --> 01:09:40,670 که در آن X رفتن به نقطه به ابتدای آرایه. 803 01:09:40,670 --> 01:09:50,420 بنابراین، هنگامی که من می گویم چیزی شبیه به X [1]، من می خواهم آن را به معنی رفتن به دومین عدد صحیح در آرایه، 804 01:09:50,420 --> 01:09:53,319 خواهد بود که این یکی. 805 01:09:53,319 --> 01:10:04,190 اما واقعا، که 4 بایت را به آرایه از آنجا که این عدد صحیح طول می کشد تا 4 بایت است. 806 01:10:04,190 --> 01:10:08,470 بنابراین افست، از مجموع 1 واقعا به معنای جبران، از مجموع 1 807 01:10:08,470 --> 01:10:12,030 بار اندازه از هر نوع از آرایه است. 808 01:10:12,030 --> 01:10:17,170 این آرایه ای از اعداد صحیح است، پس از آن می داند که به انجام 1 بار اندازه بین المللی زمانی که آن را می خواهد به جبران است. 809 01:10:17,170 --> 01:10:25,260 نحو دیگر. به یاد داشته باشید این است که معادل * (x + 1)؛ 810 01:10:25,260 --> 01:10:35,250 وقتی که من می گویند اشاره گر + 1، آنچه را که بازده است آدرس که اشاره گر ذخیره سازی 811 01:10:35,250 --> 01:10:40,360 به علاوه 1 بار اندازه از نوع اشاره گر است. 812 01:10:40,360 --> 01:10:59,510 بنابراین اگر x = ox100، آنگاه x + 1 = ox104. 813 01:10:59,510 --> 01:11:19,750 و شما می توانید از این سوء استفاده می گویند چیزی مثل کاراکتر * c = (کاراکتر) ایکس؛ 814 01:11:19,750 --> 01:11:23,050 و در حال حاضر C است برای رفتن به آدرس همان X است. 815 01:11:23,050 --> 01:11:26,040 ج به برابر با ox100، 816 01:11:26,040 --> 01:11:31,490 اما C + 1 خواهد بود برابر با ox101 817 01:11:31,490 --> 01:11:38,030 از آنجا که حسابی اشاره گر بستگی به نوع اشاره گر است که شما اضافه کردن به. 818 01:11:38,030 --> 01:11:45,390 بنابراین C + 1، آن را در C به نظر می رسد، آن را در یک اشاره گر کاراکتر، به طوری که آن را برای اضافه کردن 1 بار اندازه کاراکتر، 819 01:11:45,390 --> 01:11:48,110 است که همیشه رفتن به 1 است، بنابراین شما می توانید 101، 820 01:11:48,110 --> 01:11:54,890 در حالی که اگر من x، که هنوز هم 100، x + 1 خواهد بود 104. 821 01:11:56,660 --> 01:12:06,340 [دانشجو] آیا می توانم به شما استفاده از C + + به منظور پیشبرد اشاره گر خود را با 1؟ 822 01:12:06,340 --> 01:12:09,810 بله، شما می توانید. 823 01:12:09,810 --> 01:12:16,180 شما می توانید که با X کار نمی کند چرا که X فقط یک نماد است، آن را به یک ثابت است، شما می توانید X را تغییر دهید. 824 01:12:16,180 --> 01:12:22,610 >> اما C اتفاق می افتد فقط یک اشاره گر، و بنابراین C + + کاملا معتبر است و آن را توسط 1 افزایش است. 825 01:12:22,610 --> 01:12:32,440 اگر C فقط یک نوع int *، و سپس C + + خواهد بود 104. 826 01:12:32,440 --> 01:12:41,250 + + ریاضی اشاره گر فقط به عنوان C + 1 ریاضی اشاره گر را انجام داده اند. 827 01:12:43,000 --> 01:12:48,870 این است که در واقع بسیاری از چیزهایی مانند مرتب کردن بر اساس ادغام - 828 01:12:49,670 --> 01:12:55,710 به جای ایجاد کپی از همه چیز، شما می توانید به جای عبور - 829 01:12:55,710 --> 01:13:02,400 خواهم اگر من می خواستم به تصویب این نیمی از آرایه - اجازه را به پاک کردن برخی از این. 830 01:13:04,770 --> 01:13:10,520 بیایید می گویند من می خواستم به تصویب این طرف از آرایه به یک تابع است. 831 01:13:10,520 --> 01:13:12,700 چه من که به تابع منتقل می شود؟ 832 01:13:12,700 --> 01:13:17,050 اگر من عبور x، من در عبور از این آدرس. 833 01:13:17,050 --> 01:13:23,780 اما من می خواهم به تصویب این آدرس خاص است. پس چه باید منتقل کنم؟ 834 01:13:23,780 --> 01:13:26,590 [دانشجوی] اشاره گر + 2؟ 835 01:13:26,590 --> 01:13:29,350 [Bowden] بنابراین X + 2. بله. 836 01:13:29,350 --> 01:13:31,620 که رفتن به این آدرس می باشد. 837 01:13:31,620 --> 01:13:42,810 شما همچنین می خواهید که اغلب آن را به عنوان X [2] و سپس آدرس آن است. 838 01:13:42,810 --> 01:13:47,850 بنابراین شما نیاز دارید را به آدرس آن را به خاطر براکت dereference ضمنی است. 839 01:13:47,850 --> 01:13:53,250 X [2] اشاره به ارزش است که در این جعبه، و سپس شما می خواهید آدرس آن جعبه، 840 01:13:53,250 --> 01:13:56,850 بنابراین شما می گویند و X [2]. 841 01:13:56,850 --> 01:14:02,880 به طوری که چگونگی چیزی در ادغام مرتب کردن بر اساس جایی که شما می خواهید به تصویب بیش از نیمی از لیست را به چیزی 842 01:14:02,880 --> 01:14:08,790 شما واقعا فقط عبور و X [2]، و در حال حاضر تا آنجا که به عنوان تماس بازگشتی نگران است، 843 01:14:08,790 --> 01:14:12,510 آرایه جدید من شروع می شود وجود دارد. 844 01:14:12,510 --> 01:14:15,130 سوالات در آخرین لحظه. 845 01:14:15,130 --> 01:14:20,050 [دانشجو] اگر ما یک علامت قرار داده است - آنچه که به نام؟ >> ستاره چقدر است؟ 846 01:14:20,050 --> 01:14:23,200 [دانشجو] ستاره. >> مشخصات فنی، اپراتور dereference، اما - >> [دانشجو] Dereference. 847 01:14:23,200 --> 01:14:29,310 >> اگر ما یک ستاره و یا یک علامت قرار داده است، چه اتفاقی می افتد اگر من فقط می گویند Y = X و X یک اشاره گر است؟ 848 01:14:29,310 --> 01:14:34,620 نوع Y به چه صورت است؟ >> [دانشجو] من فقط می گویند اشاره گر آن 2. 849 01:14:34,620 --> 01:14:38,270 بنابراین اگر شما فقط می گویند Y = X، در حال حاضر نقطه X و Y به یک چیز واحد است. >> [دانشجو] نقطه به یک چیز واحد است. 850 01:14:38,270 --> 01:14:45,180 و اگر x یک اشاره گر از نوع int است؟ >> این شکایت به دلیل این که شما می توانید اشاره گر را مشخص نمی کند. 851 01:14:45,180 --> 01:14:46,540 [دانشجو] خوب. 852 01:14:46,540 --> 01:14:51,860 به یاد داشته باشید که اشاره گر، حتی اگر آنها را در قرعه کشی به صورت فلش، 853 01:14:51,860 --> 01:15:02,010 واقعا تمام فروشگاه - هوشمند * X - واقعا همه X است که ذخیره سازی چیزی شبیه به ox100 است، 854 01:15:02,010 --> 01:15:06,490 که ما اتفاق می افتد به عنوان اشاره به بلوک های ذخیره شده در 100 نمایندگی. 855 01:15:06,490 --> 01:15:19,660 بنابراین، هنگامی که من می گویم هوشمند * Y = X، من فقط کپی ox100 به Y، 856 01:15:19,660 --> 01:15:24,630 که ما فقط رفتن به عنوان Y نمایندگی، همچنین با اشاره به ox100. 857 01:15:24,630 --> 01:15:39,810 و اگر من می گویم من بین المللی = (هوشمند) X، پس از آن من در حال رفتن به مغازه هر ارزش از ox100 است 858 01:15:39,810 --> 01:15:45,100 در داخل آن، اما در حال حاضر آن را به عنوان یک عدد صحیح به جای اشاره گر تفسیر می شود. 859 01:15:45,100 --> 01:15:49,310 اما شما نیاز به بازیگران و یا دیگری آن شکایت دارند. 860 01:15:49,310 --> 01:15:53,300 [دانشجو] پس منظورت بازیگران - 861 01:15:53,300 --> 01:16:00,290 آیا برای رفتن به ریخته گری بین المللی بین المللی یا ریخته گری X از Y؟ 862 01:16:00,290 --> 01:16:03,700 [Bowden] چیست؟ 863 01:16:03,700 --> 01:16:07,690 [دانشجو] خوب. پس از این پرانتز وجود دارد رفتن به X یا آی وجود دارد؟ 864 01:16:07,690 --> 01:16:11,500 >> [Bowden] یا. x و y هم معادل هستند. >> [دانشجو] باشه. 865 01:16:11,500 --> 01:16:14,390 از آنجا که آنها هر دو اشاره گر است. >> آره. 866 01:16:14,390 --> 01:16:21,050 [دانشجو] پس از آن در 100 هگزادسیمال را در فرم صحیح ذخیره؟ >> [Bowden] آره. 867 01:16:21,050 --> 01:16:23,620 اما ارزش هر آنچه که به آن اشاره نمی شود. 868 01:16:23,620 --> 01:16:29,940 [Bowden] آره. >> [دانشجو] پس فقط آدرس در فرم صحیح است. باشه. 869 01:16:29,940 --> 01:16:34,720 [Bowden] اگر شما می خواهید برای برخی از این دلیل عجیب و غریب، 870 01:16:34,720 --> 01:16:38,900 شما منحصرا می تواند در مقابله با اشاره گر و مقابله با اعداد صحیح هرگز 871 01:16:38,900 --> 01:16:49,240 و فقط برای مثال، int * x = 0 باشد. 872 01:16:49,240 --> 01:16:53,000 سپس شما در حال رفتن به واقعا اشتباه یک بار حسابی اشاره گر شروع می شود اتفاق می افتد. 873 01:16:53,000 --> 01:16:56,570 بنابراین اعداد که آنها را ذخیره می کنند بی معنی است. 874 01:16:56,570 --> 01:16:58,940 به این که چقدر شما را تا پایان تفسیر آنها. 875 01:16:58,940 --> 01:17:02,920 بنابراین من برای کپی ox100 از * نوع int به نوع int، 876 01:17:02,920 --> 01:17:07,790 و من را به او واگذار - you're احتمالا رفتن به فریاد می زدند: در برای ریخته گری نیست - 877 01:17:07,790 --> 01:17:18,160 من را به او واگذار چیزی شبیه به (هوشمند) ox1234 به این نوع int * خودسرانه است. 878 01:17:18,160 --> 01:17:25,480 بنابراین ox123 است به همان اندازه معتبر یک آدرس حافظه است و Y است. 879 01:17:25,480 --> 01:17:32,060 و سالانه اتفاق می افتد به بازگشت این چیزی است که بسیار ox123. 880 01:17:32,060 --> 01:17:35,430 [دانشجوی] است که می تواند واقعا سرد راه برای رفتن از مبنای شانزده به شکل دهدهی، 881 01:17:35,430 --> 01:17:39,230 می خواهم در صورتی که دارای یک اشاره گر و شما آن را به عنوان یک int بازیگران است؟ 882 01:17:39,230 --> 01:17:44,860 [Bowden] شما واقعا فقط می تواند با استفاده از مثل printf نسخه قابل چاپ. 883 01:17:44,860 --> 01:17:50,300 اجازه دهید بگویم که اعضای هیات Y = 100 است. 884 01:17:50,300 --> 01:18:02,700 بنابراین printf (٪ D \ n - به عنوان شما در حال حاضر باید بدانید - نسخه قابل چاپ است که به عنوان یک عدد صحیح، x٪ است. 885 01:18:02,700 --> 01:18:05,190 ما فقط آن را به عنوان مبنای شانزده نسخه قابل چاپ. 886 01:18:05,190 --> 01:18:10,760 بنابراین یک اشاره گر است که به عنوان مبنای شانزده ذخیره می شود، 887 01:18:10,760 --> 01:18:12,960 و یک عدد صحیح است که به عنوان اعشار ذخیره می شود. 888 01:18:12,960 --> 01:18:14,700 همه چیز همان است باینری ذخیره می شوند. 889 01:18:14,700 --> 01:18:17,950 مسئله این است که ما تمایل به نشان دادن اشاره گر به عنوان مبنای شانزده 890 01:18:17,950 --> 01:18:23,260 چرا که ما از همه چیز در این بلوک 4-BYTE فکر می کنم، 891 01:18:23,260 --> 01:18:25,390 و آدرس های حافظه تمایل دارند آشنا می شود. 892 01:18:25,390 --> 01:18:28,890 ما مثل، اگر آن را با BF شروع می شود، پس از آن اتفاق می افتد بر روی پشته. 893 01:18:28,890 --> 01:18:35,560 پس از آن تنها تفسیر ما از اشاره گرها به عنوان مبنای شانزده است. 894 01:18:35,560 --> 01:18:39,200 باشه. هر گونه سوالات تاریخ و زمان آخرین؟ 895 01:18:39,200 --> 01:18:41,700 >> من در اینجا خواهم بود برای کمی پس از اگر شما هر چیز دیگری. 896 01:18:41,700 --> 01:18:46,070 و این که در پایان آن است. 897 01:18:46,070 --> 01:18:48,360 >> [دانشجو] عالیست! [تشویق حضار] 898 01:18:51,440 --> 01:18:53,000 >> [CS50.TV]