[MUSIC پخش] DAVID J. مالان: خوب. این CS50 است، و این در پایان هفته چهار است. و یکی از موضوعات امروز این است که پزشکی قانونی دیجیتال، هنر دوره نقاهت بعد اطلاعات. و در واقع، حتی اگر شما در میان می در حال حاضر از صلح در سه و برک آوت به، هفته آینده، تمرکز بر خواهد بود دقیقا این دامنه. بنابراین یکی از جالبترین شغل من تا کنون پشت در مقطع تحصیلات تکمیلی بود، وقتی که من برای محلی مشغول به کار بود شهرستان میانه دادستان منطقه است اداری، پزشکی قانونی انجام کار می کنند. بنابراین اساسا، ماساچوست پلیس ایالتی، به مناسبت، زمانی که کار بر روی موارد را در چیزهایی مانند دیسک های سخت را و فلاپی دیسک و کارت های حافظه و مانند آن. و آنها به آنها دست به من و مربی من، و هدف ما بود برای پیدا کردن شواهد، اگر هر گونه، در این رسانه ها وجود دارد. نگاه اجمالی در حال حاضر، شما ممکن است را دیده اند از این دنیا از پزشکی قانونی در رسانه ها، تلویزیون و فیلم. اما این کار من تا به حال، و اعتقاد داشتن که جهان، کاملا مانند شما آن را مشاهده کنید. بیایید نگاهی به آنچه شما احتمالا دیده می شود. [VIDEO پخش] -OK. در حال حاضر، اجازه دهید یک نگاه خوبی در شما خواهد شد. [MUSIC پخش] -Hold آن. اجرای که به عقب. یک دقیقه صبر کن. برو راست. -There. یخ که. -Full روی صفحه نمایش. -OK. یخ که. تا -Tighten در آن، به شما؟ -Vector در در که پسر های چرخ عقب. -Zoom در حق در اینجا در این نقطه. -With تجهیزات سمت راست، تصویر را می توان بزرگ و تیز. چه که؟ آن را یک برنامه افزایش است. -Can شما روشن است که هر؟ من نمی دانم. اجازه دهید آن را افزایش می دهد. -Enhance بخش A6. I افزایش جزئیات، and-- من فکر می کنم به اندازه کافی به منظور ارتقاء وجود دارد. انتشار آن را به روی صفحه نمایش من. من افزایش انعکاس در چشم او. -Let به این طریق اجرا افزایش کیفیت ویدئو. -Edgar، می تواند به شما این افزایش؟ -Hang در. -I've شده است کار بر روی این بازتاب. بازتاب کسی -There است. -Reflection. یک بازتابی از صورت انسان -There. بازتاب بانک! یک بازتاب -There. -Zoom در بر آینه. شما می توانید بازتابی را ببینید. -Can شما تصویر را از اینجا افزایش؟ -Can شما آن را افزایش؟ -Can شما آن را افزایش؟ -Can این افزایش ما؟ -Can شما آن را افزایش؟ -Hold در یک ثانیه. من را بالا ببرد. -Zoom در بر روی درب. -Times 10. -Zoom. -Move در. و بازکردن. صبر کن، متوقف شود. -Stop. -Pause آن. -Rotate ما 75 درجه در اطراف عمودی، لطفا. -Stop. بازگشت به بخش در مورد درب دوباره. -Got تقویت تصویر است که می تواند بیت مپ؟ -Maybe ما می توانیم پرادیپ سینگ استفاده روش به پنجره ها را مشاهده کنید. بانک نرم افزار دولت از هنر است. بانک مقادیر ویژه خاموش است. -With سمت راست ترکیبی از algorithms-- نور گرفته -He در الگوریتم را به سطح بعدی، و من می توانم آنها را به استفاده از افزایش این عکس. -Lock و بزرگ کردن محور z. -Enhance. بالا بردن. -Enhance. -Freeze و افزایش. [END VIDEO پخش] DAVID J. مالان: بنابراین کسانی که می تمام کلمات، اما آنها نمی مورد استفاده در جمله دارد. و در واقع در آینده، هر زمان، لطفا، شما کسی می گویند که کلمه، "افزایش" خنده فقط کمی. چرا که وقتی شما سعی می کنید به منظور ارتقاء، به عنوان مثال، این چیزی است که اتفاق می افتد. بنابراین در اینجا یک عکس زرق و برق دار است. این Daven خود CS50 است. و فرض کنید که ما می خواستیم تمرکز در در برقی در چشمانش، و یا بازتابی از پسر بد به وضوح این بود که گرفته شده توسط دوربین های امنیتی. این چیزی است که اتفاق می افتد زمانی شما زوم بر روی یک تصویر که تنها تعداد محدودی از بیت های مرتبط با آن. این چیزی است که شما می توانید دریافت کنید. و در واقع، در چشم Daven در است اما چهار، شاید شش پیکسل که آهنگسازی دقیقا همان چیزی است glimmering وجود دارد شد. بنابراین مجموعه مسائل چهار در نهایت مجبور خواهد بود شما این جهان را کشف، به خصوص از طبیعت چیزی ما تماس بگیرید فایل I / O، که در آن I / O فقط یک راه فانتزی است گفت: ورودی و خروجی. پس تا کنون، تمام تداخلات ما با یک کامپیوتر داشته ام تا حد زیادی با خود بوده است صفحه کلید و صفحه نمایش، اما بسیار با دیسک سخت نیست، و یا صرفه جویی در فایل های فراتر از آنهایی که شما خود را ارسال. برنامه های شما تا کنون داشته نشده است ایجاد، و صرفه جویی، و به روز رسانی فایل های خود را دارند. خوب، یک فایل است؟ خوب، چیزی شبیه به یک JPEG. این یک تصویر شما ممکن است و یا آپلود به فیس بوک، و یا در جایی در اینترنت را مشاهده کنید. در واقع، ما فقط عکس اره از Daven JPEG بود. و چه جالب در مورد فایل های عکس JPEG مانند این است که آنها را می توان شناسایی، به طور معمول، توسط الگوهای خاصی از بیت. به عبارت دیگر، آنچه در آن است که متمایز JPEG از GIF از PING از یک کلمه سند از یک فایل اکسل؟ خوب، آن را فقط متفاوت الگوهای بیت. و این الگوهای متفاوت هستند معمولا در آغاز این فایل ها. به طوری که زمانی که کامپیوتر خود را به یک کلمه باز می شود توضیحات، و یا زمانی که یک کامپیوتر JPEG باز می شود، به نظر می رسد به طور معمول در اولین بیت چند در فایل. و اگر آن را یک الگوی به رسمیت می شناسد، آن را می گوید، آه، این یک تصویر است. اجازه بدهید من آن را به نمایش به کاربر به عنوان یک گرافیک. یا، اوه، این به نظر می رسد مانند یک توضیحات ورد. اجازه بدهید من آن را به کاربر به عنوان یک مقاله. بنابراین به عنوان مثال، عکس JPEG، که معلوم است، می باشد نسبتا پیچیده در زیر هود. اما سه بایت اول در اکثر هر JPEG با این سه عدد شروع می شود. بنابراین بایت صفر، یک و دو، در در هر JPEG، 255، سپس شماره 216، سپس شماره 255. و آنچه که شما قادر خواهید بود برای شروع انجام در هفته آینده در واقع مجبور زیر هود از فایل ها مانند عکس JPEG و مانند فایل های بیت مپ، و دیدن چه چیزی همیشه وجود دارد تا زمانی بوده است عنوان شما با استفاده از یک کامپیوتر بوده است. اما آنچه به طور معمول وجود ندارد نوشته شده مانند اعداد اعشاری مثل این. دانشمندان کامپیوتر نمی تمایل به در ده دهی صحبت می کنند. آنها واقعا در باینری صحبت می کنند. به طور معمول، زمانی که ما می خواهیم برای بیان اعداد، ما در واقع استفاده از مبنای شانزده، که شما ممکن است به یاد مثلا از مجموعه مسائل یکی، که به چالش کشیده شما در مورد سیستم های مختلف فکر می کنم. ما، البته، آشنا هستند با اعشاری، صفر الی نه. ما در مورد دودویی صحبت کردیم. و ما واقعا باید به استفاده از آن بسیار اینجا در خارج، چون کامپیوتر استفاده کنید که. اما برنامه نویسان بسیار خواهد شد اغلب، اما نه همیشه، استفاده از مبنای شانزده، که فقط به معنی شما باید 16 حرف در الفبای خود را، به عنوان دو یا 10 مخالف است. پس چگونه شما به بالاتر تعداد از نه در مبنای شانزده؟ شما به 0، 1، 2، 3، 4، 5، 6، 7، 8، 9، الف، ب، ج، د، ه، ی، فقط با کنوانسیون. اما آنچه مهم این است که هر این یک سمبل است. هیچ 10 وجود دارد. هیچ 11، در هر سه وجود دارد، زیرا هر یک از از ارقام خود را، تنها در ده دهی دوست و درست مثل باینری، تنها باید است یک شخصیت، توسط کنوانسیون. به طوری که پس از آن از حروف الفبای ما است در اختیار ما برای مبنای شانزده. پس چه JPEG شبیه اگر شما بود به نوشتن از کسانی که برای اولین بار از سه بایت به عنوان اعشار نیست اما، به عنوان مثال، به عنوان مبنای شانزده؟ و چرا سحر و جادو است و حتی تمام آن مفید است؟ خوب، یک نگاه سریع به عنوان مثال. بنابراین اگر من ارسال از بیت که نشان دهنده این numbers-- اعشاری این ممکن است کمی زنگ زده در حال حاضر از چند هفته قبل، اما یکی از چپ و یکی از سمت راست خیلی آسان است. 255 بزرگترین عدد ما بود می تواند با هشت بیت را نمایندگی کند. این همه آنهایی بود. بنابراین تنها کسی که ملایم جالب به نفر وسط است. و اگر شما نوع از انجام ریاضی، شما اینطور نتیجه بگیریم که، در واقع، که الگوی یک و صفر نشان دهنده 216. بنابراین اجازه دهید فقط برای تصریح در حال حاضر که این درست است. اما چرا این جالب است؟ خوب، یک بایت، البته، هشت بیت است. و معلوم است که اگر شما فکر می کنم یک بایت به عنوان دو تکه از چهار بیت، مثل این. اجازه بدهید من فقط برخی از فضای اضافه کنید. بنابراین قبل از، پس از. ام من فقط افزود: برخی از فضای سفید به خاطر تجسم در اینجا. چگونه ممکن است ما در حال حاضر در نشان دادن، مثلا هگزادسیمال هر چهار بیت، هر مجموعه ای از چهار بیت؟ بنابراین به عنوان مثال، در سمت چپ در حال حاضر، ما باید در 1،111 باینری. این تعداد در ده دهی چیست، اگر شما با ریاضیات؟ شما باید به جای آنهایی که، محل twos، محل چهار دست و پا، و محل هشت. رسید 15. DAVID J. مالان: این 15. بنابراین اگر ما هشت و چهار به علاوه دو به علاوه یک، ما 15. بنابراین من می تواند 15 زیر بنویسید 1111، اما در کل نکته در اینجا مبنای شانزده است، دهدهی نیست. بنابراین به جای نوشتن 15، 1-5، من قصد دارم برای نوشتن که در سحر و جادو، که اگر شما فکر می کنم، اگر شما صفر از طریق اف، چیزی است که به 15 خواهد؟ رسید ج. DAVID J. مالان: پس از آن که معلوم آن در ج. و شما می توانید کار که از با گفتن، خوب، اگر یک 10 است، سپس OK، ج 15 است. پس در واقع، ما می تواند بازنویسی این مجموعه همان تعداد به عنوان ج ج. و پس از آن اگر ما کمی از ریاضی، ما اینطور نتیجه بگیریم که که د است. هشت بسیار آسان است، چرا که ما یک به یک در جای هشت. و پس از آن، ما باید یک زن و شوهر تر ج ج است. پس چه انسان تمایل به قرارداد انجام هنگام استفاده از هگزادسیمال آنها فقط ارسال این کمی موجز تر، می توانید از بیشتر از آن فضای سفید خلاص شوید. و فقط به فوق العاده به روشن خوانندگان که این هگزادسیمال است، کنوانسیون ساده در میان انسان است که شما ارسال صفر ایکس، که هیچ معنای دیگر از یک شناسه تصویری از، در اینجا می آید یک عدد سحر و جادو. و پس از آن، شما را دو رقم، ج ج در این مورد، پس از آن د، آنگاه f ج. بنابراین داستان کوتاه مدت، هگزادسیمال فقط تمایل دارد مفید باشد، زیرا هر یک از آن رقم، صفر از طریق اف، کاملا خط تا با یک الگوی از چهار بیت. بنابراین اگر شما دو رقم هگزادسیمال، صفر از طریق F، دوباره و دوباره، است که به شما کاملا هشت بیت یا یک بایت. به همین دلیل آن را به تمایل دارد بود مرسوم مفید است. هیچ فکری وجود دارد محتوای واقعا فراتر از آن، دیگر از ابزار های واقعی آن است. در حال حاضر عکس JPEG تنها نمی فایل فرمت های گرافیکی. شما ممکن است به یاد آورید که وجود دارد فایل های شبیه به این در جهان، حداقل از چند سال به عقب. پس این در واقع نصب شده در ویندوز XP در میلیون ها نفر از رایانه های شخصی در سراسر جهان. و این یک فایل بیت مپ، BMP بود. و یک فایل بیت مپ، به عنوان شما بعد را ببینید هفته، فقط به معنای یک الگوی نقطه، پیکسل به عنوان آنها نامیده می شود، نقشه در بیت، واقعا. پس چه جالب، هر چند، در مورد این فرمت فایل، BMP، است که در زیر هود، آن بیش از فقط سه کلمه در ادامه متن که تشکیل هدر خود را، به طوری که به صحبت می کنند، چند گزش اول است. در واقع به نظر می رسد کمی در نگاه اول پیچیده است. و شما این را در مجموعه ای P را ببینید. و گرفتن چیزی از خاص از این در حال حاضر است بسیار مهم است، به عنوان تنها حقیقت که در آغاز هر بیت مپ فایل، فرمت های گرافیکی، یک دسته کامل از اعداد وجود دارد. در حال حاضر مایکروسافت، نویسنده این فرمت، تمایل به تماس آن چیزهایی که طول int برابر نیست و کاراکتر و شناور، بلکه کلمات و د واژه ها و پوزیشن های خرید و بایت. بنابراین آنها فقط انواع داده های مختلف است. آنها نام های مختلف هستند برای همین. اما شما خواهید دید که در P مجموعه چهار. اما این فقط می گویند که اگر یک انسان دوبار کلیک برخی از فایل .BMP در خود و یا دیسک سخت خود را، و یک پنجره باز می شود تا نشان او و یا او را که تصویر، که به دلیل عامل اتفاق افتاده است سیستم احتمالا متوجه نه تنها پسوند فایل .BMP در نام فایل، بلکه این واقعیت است که وجود دارد برخی از کنوانسیون به الگوی بیت در ابتدا از آن فایل بیت مپ. اما اجازه دهید در حال حاضر تمرکز بر مانند یک فایل پیچیده، اما در عوض در چیزی شبیه به این. فرض کنید در اینجا در GEdit، I فقط باید آغاز از برنامه ای است که بسیار ساده است. من برخی شامل تا بالا. در حال حاضر من # شامل "structs.h" اما من به که در یک لحظه است. اما این در حال حاضر مفید است. بنابراین این یک برنامه است که رفتن به پیاده سازی مانند پایگاه داده ثبت شده است. بنابراین یک پایگاه داده از دانش آموزان، و هر دانش آموز در جهان یک نام و یک خانه و احتمالا برخی از چیزهای دیگر، اما ما آن را ساده نگه دارید. هر دانش آموز یک نام و یک خانه است. بنابراین اگر من می خواستم به ارسال نامه برنامه که هدف در زندگی تنها به تکرار از صفر تا سه، اگر سه دانشجو وجود دارد در دانشگاه هاروارد. و من فقط می خواهید برای دریافت، با استفاده از GetString، نام هر دانش آموز و خانه، و پس از آن فقط آن را چاپ کنید. این نوع مانند هفته یکی، دو هفته مسائل در حال حاضر، که در آن من فقط می خواهم برای حلقه و یا چیزی شبیه به آن. و من می خواهم به GetString تماس چند بار، و پس از آن ج چند بار چاپ. پس چگونه ممکن است من این کار را، هر چند، زمانی که هر دو یک نام و یک خانه برای هر دانش آموز دارد؟ بنابراین اولین غریزه من ممکن است به انجام چیزی شبیه به این. من برای اولین بار ممکن است بگویید، خوب، من، می گویند، آرایه ای از رشته به نام نام. و من hardcode سه اینجا باشم. چه می خواهند I برای قرار دادن وجود دارد؟ بنابراین دانش آموزان، چرا که فقط ثابت اعلام شده در بالا، فقط تا من مجبور به hardcode سه در مکان های متعدد. به این ترتیب، من می توانم آن را به یک مکان تغییر دهید، و آن را در همه جا تاثیر می گذارد تغییر. و بعد، من ممکن است انجام رشته خانه دانش آموزان. و در حال حاضر، من ممکن است چیزی شبیه به انجام برای (اعضای هیات من = 0؛ من <دانش آموزان؛ من + +. پس من تایپ سریع، اما این احتمالا نحو آشنا در حال حاضر. و در حال حاضر، این اخیر بود. اگر من می خواهم به در i ام قرار داده نام و نام خانوادگی دانش آموز، من فکر می کنم من این کار را. و پس از آن، نه نام اما خانه های در پرانتز من. من این کار، GetString، و اجازه دهید من بروید و این خط. موافق هستید؟ مخالف؟ این بسیار کاربر پسند نیست. من کاربر چه کاری انجام دهید گفت نه. اما در حال حاضر، اگر من هم می خواستم به بعد، اجازه دهید مثلا چاپ این چیزها out-- تا TODO بعد. من قصد دارم برای انجام بیشتر با this-- این مسلما نیست. یک پیاده سازی صحیح گرفتن نام ها و خانه ها، سه از آنها در مجموع از هر، از یک کاربر. اما این طرح خیلی خوب نیست، درست است؟ اگر یک دانش آموز است و نه فقط یک نام و یک خانه، بلکه به تعداد ID، و شماره تلفن، و آدرس ایمیل، و شاید یک صفحه اصلی، و شاید توییتر دسته، و هر تعداد از جزئیات دیگر ارتباط با دانش آموز و یا یک شخص، به طور کلی. چگونه ما شروع به اضافه قابلیت های این برنامه؟ خوب، من می خواهم ساده ترین راه ممکن است احساس است برای انجام کاری مانند، اجازه دهید بگویم، اعضای هیات شناسه دانش آموزان. بنابراین من می توانید تمام شناسه های خود را در آنجا قرار داده است. و پس از آن، برای چیزی مانند شماره تلفن، من چگونه به نیستم نمایندگی که فقط رتبهدهی نشده است. بنابراین اجازه دهید پیش رو و فقط تماس بگیرید این twitters دانش آموزان، که عجیب و غریب کمی، but-- است و یک دسته زمینه های بیشتر. من شروع کرده به طور موثر کپی و اینجا پیست کنید. و این است که به رشد بسیار گنده به سرعت، درست است؟ آیا آن را نمی تواند به خوبی اگر وجود داشت در جهان ساختمان داده شناخته شده نه به عنوان اعضای هیات و یا یک رشته است، اما چیزی سطح بالاتر، انتزاعی، پس به صحبت می کنند، شناخته شده به عنوان یک دانش آموز؟ C با ساخته شده است در آمده است قابلیت برای دانش آموزان، اما چه می شود اگر من می خواستم به آن را مانند؟ خوب، که معلوم است، من قصد دارم به باز کردن یک فایل به نام structs.h در اینجا، و شما می توانید دقیقا همان است که انجام دهد. و ما در حال رفتن به شروع به انجام این در حال حاضر. و در زیر هود از P مجموعه سه، شما در حال حاضر انجام شده است این در حال حاضر. هیچ چیز مانند یک گرم نادرست وجود دارد یا بیضی شکل گرم در C. زبان برنامه نویسی مردمی در استنفورد آن اجرا انواع داده با استفاده از این روش در اینجا، اعلام داده های جدید خود را انواع با استفاده از یک کلمه کلیدی جدید به نام ساختار و دیگر یکی از typedef نامیده می شود. و در واقع، حتی اگر نحو به نظر می رسد کمی متفاوت از مسائل ما قبل از دیده می شود، در اصل، آن را فوق العاده ساده است. این فقط به معنی "تعریف یک نوع." که برای رفتن به یک ساختار، و ساختار درست مثل یک ظرف برای چیزهایی های متعدد. و این ساختار است که به یک رشته به نام نام، و یک رشته به نام خانه. و اجازه دهید تماس بگیرید، فقط برای راحتی، این دانش آموز کل ساختار داده ها. بنابراین در حال حاضر شما برای به دست آوردن نقطه و ویرگول، شما در حال حاضر اطلاعات خود را ایجاد نوع دانشجویی به نام که در حال حاضر در کنار اعضای هیات مخفف، و شناور، و کاراکتر و رشته، و گرم نادرست و گرم بیضی شکل و به هر تعداد از چیزهای دیگر مردم را اختراع کرده اند. پس چه در مورد این مفید در حال حاضر این است که اگر من به عقب به ساختار و 0 به پایان برساند این پیاده سازی، که من نوشت در پیش در اینجا، توجه کنید که تمام از messiness اجتناب ناپذیر است که در مورد شروع به اتفاق می افتد که من اضافه شد شماره تلفن ها و twitters و همه این چیزها دیگر به تعریف دانش آموز، حال حاضر آن را به اختصار پیچیده فقط به عنوان یک مجموعه ای از دانش آموزان است. و هر یک از این دانش آموزان در حال حاضر چیزهایی چند در داخل آن است. به طوری که فقط برگ یک سوال. چگونه می توانم شما را در نام می کنید، و خانه، و ID، و هر چیز دیگری است در داخل از دانش آموزان؟ سوپر ساده، و همچنین. نحو جدید، اما یک ایده ساده است. شما به سادگی شاخص را به آرایه، همانطور که ما در هفته گذشته و این کار را کرد. و چیزی که به وضوح قطعه جدید از نحو؟ فقط، که به معنی "به داخل ساختار و گرفتن زمینه نام نام، دریافت این زمینه به نام خانه، دریافت این زمینه به نام دانش آموز. " بنابراین در P مجموعه سه، اگر شما هنوز هم بر روی آن کار می کند، و بیشتر مردم هنوز می، متوجه است که شما به عنوان شروع به استفاده از چیزهایی مانند rects g و بیضی و چیزهای دیگر که به نظر نمی رسد از هفته صفر، یک، یا دو آمده، متوجه است که دلیلش این است که دانشگاه استنفورد اعلام برخی از انواع داده های جدید. و در واقع، این دقیقا همان چیزی است که ما خواهیم انجام، و همچنین، در P مجموعه ای چهار، هنگامی که ما شروع به مقابله با همه چیز مانند تصاویر، بیت مپ ها، و بیشتر. به طوری که فقط یک تیزر، و یک است مدل ذهنی برای آنچه که به آمده است. در حال حاضر، من procrastinated کمی این صبح است. من از نوع کنجکاو برای دیدن چه بود تصویر زمینه مایکروسافت در واقع به نظر می رسد مانند امروز. و معلوم کسی در سال 2006 در واقع به رفت و تقریبا دقیقا همان نقطه برای عکاسی در واقعیت آنچه به نظر می رسد که این روزها. این رشته در حال حاضر کمی بیش از حد رشد. بنابراین صحبت کردن در حال حاضر از تصاویر، اجازه دهید به ارمغان می آورند Daven اینجا بر روی صفحه نمایش و نیکلاس، و فقط به شما یادآوری که اگر شما می خواهم برای پیوستن به ما برای ناهار این جمعه، سر به URL معمول ما اینجا. تا جایی که ما را ترک نمی کردن در روز دوشنبه؟ ما معرفی این مشکل، درست است؟ این به ظاهر درست بود اجرای مبادله، به موجب آن شما مصرف دو نوع داده int، به نام، به نام ب، مبادله آنها، درست مانند لورا در اینجا در صحنه با شیر و آب، با استفاده از یک موقت متغیر، و یا یک فنجان خالی، به طوری که ما می تواند ب در و در را ب بدون اینکه یک ظرف غذا از همه چیز. ما یک متغیر استفاده می شود. این دما نامیده می شود. اما چه اساسی بود مشکل با این کد در روز دوشنبه؟ مشکل اینجا چه بود؟ آره. رسید این طول می کشد تا فضای بیشتری. DAVID J. مالان: طول می کشد تا بیشتر فضا، چون من با استفاده از یک متغیر، و این خوب است. این درست است، اما من رفتن به می گویند که OK. این فقط 32 بیت در بزرگ است طرح مسائل، بنابراین یک معامله بزرگ. دیگر افکار؟ رسید تنها سواپ متغیرهای محلی. DAVID J. مالان: دقیقا. این تنها سواپ متغیرهای محلی. از آنجا که هر زمان با شما تماس function-- هنگامی که من تا به حال سینی را از آننبرگ زمان آخرین، شما باید اصلی در پایین. به محض این که شما یک تابع به نام تماس مبادله، مبادله کند x و y می کنید، ارزش های اصلی. چه مبادله گرفتن، آیا ما ادعا می کنند؟ رسید کپی. DAVID J. مالان: بنابراین نسخه از آنها را. بنابراین آن را می شود یک و دو، اگر شما یاد مثال از زمان گذشته، اما یک کپی از یک و دو که با موفقیت عوض میکنه. اما متاسفانه در پایان، این ارزش ها هنوز هم همان است. بنابراین ما می توانیم این کار را با دیدن ما دوست جدید، امیدوارم GDB، که شما یا TFS و کلسیم دارند شده است شما هدایت به سمت به شرح زیر است. بنابراین هیچ فراخوان مبادله به نظر می رسد like-- اجازه دهید باز کردن this-- به نظر می رسد مثل این. ما x به دو مقدار دهی اولیه به یک، y است. اگر یک دسته از چاپ اف است. اما پس از آن، تماس کلیدی در اینجا بود به مبادله، که دقیقا ما کد است فقط یک لحظه قبل دیدم. که در ابتدا درست باشد نگاه، اما عملکرد، این برنامه کار نمی کند، چون آن به طور دائم x و y مبادله نیست. بنابراین اجازه دهید این را، یک گرم سریع تا اینجا با GDB، ./noswap. یک دسته از اطلاعات قریب به اتفاق که من در حال حاضر از شر را با کنترل L دریافت کنید. و در حال حاضر، من قصد دارم به جلو بروید و آن را اجرا کنید. و متاسفانه، که این بود که مفید نیست. این برنامه در داخل این فرار برنامه ای به نام GDB، دیباگر، اما اجازه نداد که من فشار با نوک انگشت در اطراف. پس چگونه می تواند من در واقع مکث اعدام در داخل این برنامه؟ بنابراین شکستن. و من می توانم در هر شکستن خط شماره، یک، 10، 15. اما من همچنین می توانید نمادین شکستن با گفتن اصلی استراحت. و این که در آینده به راه یک استراحت نقطه، ظاهرا در خط 16 در main. و در جایی که خط 16 است؟ اجازه دهید تا به کد و تا به noswap. و در واقع، خط 16 است بسیار برای اولین بار در برنامه است. بنابراین در حال حاضر، اگر من پیش بروید و نوع اجرای این زمان، را وارد کنید، آن متوقف شد. بنابراین اجازه دهید فشار با نوک انگشت در اطراف. چاپ x-- چرا ایکس صفر است؟ و علامت دلار را نادیده گرفت. که فقط برای خیال باف استفاده از این برنامه است. چرا ایکس صفر در حال حاضر است؟ آره. رسید این درست قبل از متوقف شد خط 16، در واقع نه در خط 16. DAVID J. مالان: دقیقا. GDB، به طور پیش فرض، متوقف شده است اعدام درست قبل از خط 16. پس از آن اجرا کنید، که به معنی x است برخی از ارزش ناشناخته است. و ما خوش شانس است که آن را کردم چیزی پاک مانند صفر است. بنابراین در حال حاضر اگر نوع I بعدی، در حال حاضر آن اعدام 16. این انتظار برای من برای اجرای 17. اجازه بدهید پیش رو و چاپ ایکس بروید. این یکی است. اجازه بدهید پیش رو و چاپ سالانه است. اکنون چه باید مراجعه کرد؟ رسید [نامفهوم] DAVID J. مالان: A بلندتر کم است. رسید [نامفهوم] DAVID J. مالان: نه کاملا به اجماع. بله، ما برخی از ارزش زباله را ببینید. در حال حاضر، سالانه 134514064 وجود دارد. خوب، آن را فقط به برخی از ارزش زباله. برنامه من با استفاده از RAM برای مقاصد مختلف. در توابع دیگر وجود دارد. سایر مردم در داخل کامپیوتر من نوشت. بنابراین کسانی که بیت برای استفاده شده است ارزش های دیگر، و آنچه من از دیدن بقایای است استفاده از قبل از آن حافظه است. بنابراین هیچ معامله بزرگ است، چرا که به محض که من تایپ بعدی و پس از آن سالانه چاپ، آن را به مقداردهی اولیه ارزش است که من می خواهم. بنابراین در حال حاضر، اجازه دهید پیش بروید کمی سریع تر. N برای آینده. اجازه دهید دوباره آن را انجام دهد. اجازه دهید دوباره آن را انجام دهد. اما من نمی خواهم به ضربه آن را در اینجا، چرا که اگر من می خواهید برای دیدن آنچه اتفاق افتاده در داخل از مبادله، چه فرمان است؟ رسید مراحل. DAVID J. مالان: مراحل. پس این من مراحل را به تابع، به جای بیش از آن. و در حال حاضر، آن را کمی مرموز صادقانه، اما این فقط به من گفتن من در حال حاضر در خط 33 هستم. و اجازه دهید این را دوباره انجام دهید. چاپ درجه حرارت. ارزش زباله، منفی این زمان، اما این فقط هنوز یک مقدار زباله. بنابراین اجازه دهید کار را انجام بعدی، دما چاپ. این تا 1، مقداردهی اولیه، که مقدار x، نام دیگر بود. در حال حاضر، که در آن ما و آینده X از؟ خوب، اطلاع در اصلی، ما نام این مقادیر x و y. ما پس از گذشت آنها را به مبادله به شرح زیر است. X برای اولین بار آمد، کاما y است. و پس از آن، مبادله می تواند آنها را x و y تماس بگیرید. اما برای وضوح، آن را تماس آنها a و b. اما a و b در حال حاضر برای رفتن به کپی از x و y به دست آمد. بنابراین اگر من به بازگشت به GDB، دما در حال حاضر یک و در حال حاضر یکی. اما اگر من در کنار و در حال حاضر انجام چاپ ، در حال حاضر بیش از نقل مکان کرد. شیر شده است را به سابق ریخت شیشه آب پرتقال، و یا بالعکس. و اگر من بعد دوباره، و در حال حاضر اگر من نسخه قابل چاپ کردن به عنوان یک چک سلامت عقل، هنوز هم دو، اما ب در حال حاضر یکی. صادقانه بگویم، هنوز هم وجود دارد. برای من مهم نیست که چه دما است. اما به محض من در حال حاضر تایپ، اجازه دهید بگویم، ادامه برای رفتن به عقب، در حال حاضر من در پایان هستم برنامه. و متاسفانه، x است هنوز هم یکی و y است که هنوز هم دو. پس چه استفاده از GDB وجود دارد؟ آن را نداشت من ثابت مشکل در هر سه، اما امیدوارم به من کمک درک آن را تحقق که بله، منطق من درست است، اما کد من این است که در نهایت داشتن نیست تاثیر دائمی است. به طوری که مشکل ما است رفتن به امروز در حال حاضر حل کند. اما اجازه دهید وجود دارد از طریق این. عبارات دروغ است. این، بیش از حد، نه نوع داده که در C. وجود دارد این مترادف برای برخی بوده است زمان برای چیزی دیگر، و ما می توانیم نشان می دهد که به شرح زیر است. اجازه بدهید من به جلو و باز کردن برنامه مقایسه-0 نام. و به جای تایپ این یکی از، ما شروع به از طریق کد راه رفتن من در حال حاضر نوشته است، اما این چند خط تنها. بنابراین این مقایسه-0. و اولین چیزی که من انجام می دهند گرفتن یک خط از متن. اما متوجه آنچه که من هستم انجام برای اولین بار. تفاوت وضوح در مورد خط 21 است؟ در واقع، یک دقیقه صبر کنید. این نسخه دو است. این است که حتی برنامه درست نیست. همه حق است، هشدار ضربه. همه حق است، پس فراموش نکنید که. این پاسخ به یک سوال آینده است. در اینجا مقایسه-0 است، و من در مورد به دست آوردن یک خط از متن. برنامه بسیار ساده تر. پس این سر راست است. این مثل هفته یکی، دو هفته مسائل در حال حاضر. رشته s = GetString. در حال حاضر، من آن را دوباره پایین در اینجا می گویند. رشته تی = GetString. و پس از آن، آخرین چیزی که در این برنامه، به عنوان نام آن نشان می دهد، است من قصد دارم سعی کنید به آنها را مقایسه کنید. بنابراین اگر، در رشته اول، برابر با = تی، پس من هستم رفتن به می گویند شما از نوع همین. دیگری، من قصد دارم برای گفتن شما چیزهای مختلف را تایپ کنید. بنابراین اجازه دهید کامپایل و اجرای این برنامه است. بنابراین مقایسه صفر را. به نظر می رسد خوب است. بدون خطا کامپایل. اجازه بدهید من به جلو ساعت و نوع ./compare-0. اجازه بدهید من به جلو و چیزی می گویند : Daven و چیزی: راب. و من چیز های مختلف تایپ کنید. تا کنون، خیلی خوب است. برنامه به نظر می رسد درست باشد. اما اجازه دهید دوباره آن را اجرا کنید. بگو چیزی: گیب. بگو چیزی: گیب. خوب. شاید من ضربه نوار فضا و یا چیزی بد بو. اجازه دهید دوباره آن را انجام دهد. بنابراین Zamyla. Zamyla. همه چیز متفاوت است. پس چه می گذرد؟ بنابراین ما باید این دو خط از کد، GetString دو بار به نام. و پس از آن، من به سادگی هستم تلاش برای مقایسه s و t. اما چیزی که واقعا پس از آن در جریان است؟ خوب، دست خط من در مورد به قصاب این مثال تا حدودی. و اجازه دهید در واقع پرتاب این تا اینجا، و همچنین. بنابراین ما باید یک خط مانند رشته s = GetString. به طوری که به سادگی اولین خط جالب از برنامه است. اما آنچه تمام این مدت بوده است در رفتن در زیر هود؟ خوب، در سمت چپ رشته، که برخی از نوع متغیر است، و آن را به نام است. بنابراین من می دانم که این با استفاده از حافظه، و یا RAM، در کامپیوتر من به نحوی. من می خواهم به مجرد رسم است که به عنوان یک مربع است. 32 بیت، که معلوم است، اما بیشتر در مورد که در آینده است. و پس از آن، چه خبر است اینجا؟ خب، بدیهی است که GetString می شود یک رشته از کاربر. و GetString کردم Zamyla یا گیب و یا Daven. بنابراین اجازه دهید اول را انتخاب کنید از این که Daven بود. بنابراین به طور موثر، چه GetString کردم من در این مورد برای اولین بار از D--V-الکترونیکی نفر بود. و پس از آن، چه چیز دیگری را انجام داد آن مخفیانه به من بدهید؟ رسید [نامفهوم] DAVID J. مالان: آره، / 0 یا null شخصیت. پس از آن به طور موثر یک رشته به من داد. اما ما در حال حاضر از قبل می دانیم به نظر می رسد که یک رشته فقط یک آرایه است از شخصیت، و آن را توسط خاتمه این شخصیت نگهبان ویژه، / 0. اما اگر این درست است و این یک مربع است، این است که به وضوح یک مستطیل بسیار بزرگتر است. و در واقع، این است که، من ادعا می کنند، تنها 32 بیت. و این است که به وضوح بیش از 32 بیت، به دلیل این است که احتمالا هشت به اضافه هشت به اضافه هشت به علاوه هشت به اضافه هشت، فقط به خاطر اینکه از بایت در ASCII. چگونه هک می خواهیم به جا Daven در این جعبه کوچک که اینجا هستید؟ خب، آنچه که در واقع انجام GetString؟ خوب، این شبکه در اینجا نشان دهنده حافظه کامپیوتر من یا RAM. بنابراین اجازه دهید به دلخواه می گویند که اگر هر یک از این نشان دهنده یک بایت، پس ما می توانیم هر یک از فکر می کنم بایت به عنوان داشتن یک آدرس، مانند 33 خیابان آکسفورد، و یا 34 خیابان آکسفورد، و یا 35 خیابان آکسفورد. بنابراین درست مانند خانه ها دارای آدرس و ساختمان های دارای آدرس، این کار را انجام بایت فردی حافظه آدرس یا شماره که منحصر به فرد آنها را تشخیص دهد. در حال حاضر، این اختیاری است. اما برای نگه داشتن آن ساده است، من قصد دارم به استفاده از مبنای شانزده فقط با کنوانسیون، اما 0x نمایش به معنای چیزی دیگر از "این مبنای شانزده است." و من قصد دارم به ادعا می کنند که "D" به پایان می رسد تا در بایت یکی در حافظه است. من هیچ چیز دیگری که در رو حافظه، بنابراین Daven کردم نقطه اول در بایت یکی. این، پس از آن، در حال رفتن به 0x2. این است که رفتن به 0x3. این است که رفتن به 0x4. این است که رفتن به 0x5. این است که رفتن به 0x6. اما هنگامی که شما شروع به فکر کردن در مورد چه انجام این کار کامپیوتر در زیر هود، شما شروع می تواند به استنباط چگونه شما، چند سال پیش، که اند C خود را اجرا. GetString احتمالا چیست returning-- به دلیل آن احساس می کند مانند آن را بازگشت Daven، فی نفسه، چرا که او قطعا نمی به جا در این box-- کمی بنابراین آنچه که GetString احتمالا از بازگشت؟ رسید [نامفهوم] DAVID J. مالان: محل Daven. و آن را به انجام این کار از زمانی که هفته یکی. چه GetString واقعا بازگشت یک رشته، به خودی نیست. این یکی از دروغ های کوچک سفید است. این بازگشت آدرس رشته در حافظه، آدرس منحصر به فرد. Daven در 33 خیابان آکسفورد زندگی می کند. اما به طور خلاصه تر، گاوین زندگی می کند در 0x1، نشانی شماره یک. پس چه می شود در این قرار داده جعبه کوچک پس از آن، به روشنی، فقط آدرس آن رشته است. بنابراین تمام این مدت، این در جریان بوده است. اما آنچه این نکات در در حال حاضر این است که اگر همه این است تعداد در داخل از آن، که در است برای متوقف کردن تو، برنامه نویس، از قرار دادن هر تعداد در هر متغیر و فقط پریدن به تکه از حافظه؟ و در واقع، خواهیم دید که یک دفعه بعد تهدید است. اما در حال حاضر، این احساس کافی نیست. اگر من می گویم، به من رشته، تو به من Daven دهد. اما شما واقعا به من Daven دهد. همه شما به من آدرس Daven است. چگونه می توانم پس از آن برای اطمینان که در آن Daven آغاز می شود و ends-- داستان از گرفتن weird-- که در آن Daven شروع می شود و به پایان می رسد، و پس از آن، بعد از رشته در حافظه شروع می شود؟ خوب، اگر شما در حال توزیع من از آغاز Daven، اساسا، چگونه من می دانم که در آن پایان نام خود را است؟ این کاراکتر تهی خاص، که همه مهم تر اگر رشته زیر هود به سادگی شناسایی منحصر به فرد از مکان آنها در حافظه است. بنابراین تمام این مدت، که آنچه در جریان بوده است. بنابراین، هنگامی که ما در حال حاضر در کد اینجا، توضیح اگر شما که اشکال در خط 26. چرا Zamyla و Zamyla متفاوت است؟ چرا گیب و گیب متفاوت است؟ بله، در پشت. رسید آنها آدرس های مختلف داشته باشد. DAVID J. مالان: نگران نباشید، زیرا آنها آدرس های مختلف. چرا که وقتی به GetString تماس بگیرید دوباره، که من به سرعت در اینجا، در صورتی که این خط دوم، رشته است تی، که من در آن برنامه بود، برابر تماس دیگر به GetString. دفعه بعد من تماس بگیرید GetString، من قصد دارم برای به دست آوردن یک تکه مختلف از حافظه است. GetString مجاز است به درخواست عامل سیستم برای بیشتر و بیشتر حافظه است. این قصد ندارم به استفاده مجدد از همان شش بایت هر زمان تنها. این رفتن به یک جدید تکه از حافظه، که به معنی تن است رفتن به دریافت برخی از ارزش های دیگر بیش از اینجا. بنابراین، هنگامی که من انجام می دهم ها برابر است با = تی، شما مقایسه کنید D در برابر این و در برابر این و V در برابر این. شما مقایسه این در برابر این، که رک و پوست کنده useless-- بسیار useful-- است کاملا بی فایده است، چون که واقعا مراقبت که در آن رشته در حافظه هستند؟ و در واقع، ما ندارد. و ما به نمی شروع به خصوص مراقبت. تنها تا آن حد است که اشکالات می تواند بوجود می آیند و تهدیدات امنیتی می تواند اراده بوجود می آیند ما در واقع شروع به در مورد این مراقبت. بنابراین اجازه دهید این مشکل را حل کنند. معلوم است، شما آن را حل فوق العاده به سادگی. و اجازه دهید در واقع، قبل از من نشان می دهد که دوباره، چه شما اگر در یک کلاس CS50 انجام دهید، و شما تا به حال برای پیاده سازی یک مقایسه در برابر دو رشته. شما به وضوح نه تنها می تواند استفاده کنندگان برابر با = تی. اما فقط منطقی چگونه، این رشته شما مقایسه در برابر این رشته با استفاده از کد C؟ آره. رسید فقط انجام برای حلقه [نامفهوم] DAVID J. مالان: کامل. رسید [نامفهوم] DAVID J. مالان: آره. فقط برای حلقه یا استفاده از یک در حالی که حلقه یا هر چیز دیگری. اما فقط ایده اولیه اعمال می شود که اگر این یک تکه از حافظه یا آرایه ای است و این است، تکرار بیش از هر دو در همان زمان. و فقط حروف مقایسه کنید. و شما رو به یک کمی دقت کنید، شما انجام یک انگشت را نمی خواهم به گذشته دیگر چرا که یک رشته است طولانی تر از دیگر. بنابراین شما در حال رفتن به می خواهم برای بررسی این مقدار خاص در پایان، تهی. اما واقعا، در پایان، به همین سادگی است. و رک و پوست کنده، ما لازم نیست برای دوباره نویسی است که چرخ. در اینجا نسخه دو است. و چیزی که من قصد دارم برای گفتن این است که به جای مقایسه ها برابر است با = t، من به جای رفتن به می گویند، اگر رشته مقایسه ها با کاما تی برابر با = 0. در حال حاضر، آنچه که رشته مقایسه کرد؟ به نظر می رسد، آن را به یک تابع است که همراه با C، که هدف در زندگی مقایسه دو رشته. و هم بزنید مقایسه، اگر ما به عنوان خوانده شده خود را صفحه مرد یا اسناد و یا CS50 مرجع، آن را به سادگی به شما بگویم که به هم بزنید مقایسه بازده یا منفی تعداد یا تعداد صفر یا مثبت، که در آن صفر به معنی آنها برابر است. پس فقط حدس. اگر چه ممکن است به معنای آن هم بزنید بازده مقایسه ارزش منفی یا مثبت؟ رسید بزگتر یا کمتر از. DAVID J. مالان: آره، بزرگتر یا کمتر از. بنابراین اگر شما می خواهید مرتب سازی بر اساس یک کل دسته ای از رشته ها در یک dictionary-- که ما خواهد شد در نهایت به پایین road-- عملکرد مناسب برای استفاده به طور بالقوه، چرا که آن را برای انجام این کار مقایسه رشته ها را برای شما، و به شما می کند می آید قبل از ب، و یا می کند ب قبل از حروف الفبا آمده است. ما دقیقا همان است که می توانید انجام دهید. و متوجه من یکی دیگر را انجام داد چیزی که در این مثال. چه چیز دیگری تغییر کرده است بالاتر در این تابع اصلی؟ کاراکتر *. و این که دروغ سفید دیگر است. در تمام این مدت، هنگامی که شما ام نوشتن رشته، ما مخفیانه بازنویسی شده است رشته را به عنوان کاراکتر * به طوری که صدای شیپور در واقع شما درک می کند. به عبارت دیگر، در CS50.h و همانطور که ما در نهایت خواهید دید، ما مترادف نام رشته که همان چیزی که به عنوان کاراکتر * است. و در حال حاضر، تنها که می دانم * در این زمینه، حداقل، این معنی است که آدرس. آدرس از چه؟ خوب، این واقعیت است که من گفتم * کاراکتر، و * اعضای هیات و یا شناور *، بدان معنی است که کاراکتر * می باشد آدرس یک کاراکتر. پس از این کادر کوچک، با نام مستعار رشته، واقعا از نوع char *، که به سادگی راه فانتزی گفتن است، در این جعبه یک آدرس بروید. و آنچه که آدرس برای اشاره؟ ظاهرا، کاراکتر. اما ما می تواند کاملا باید اعضای هیات * و چیزهای دیگر. اما در حال حاضر، کاراکتر * واقعا بیشتر سر راست و یکی از علاقه. بنابراین این مشکل در جریان است به افزایش است، هر چند، دوباره. فرض کنید من باز کردن این برنامه است. بیایید ببینیم که اگر در حال حاضر ما می توانیم پیش بینی چه چیزی اشتباه است با این کد. بنابراین در این برنامه، کپی-0، I هستم رفتن به پیش بروید و دوباره تماس بگیرید GetString و ذخیره ارزش در ثانیه. و پس از آن، چرا من این کار، فقط به عنوان یک یادآوری از هفته گذشته؟ ما می گویند که GetString گاهی اوقات null بر می گردد. چه اگر منظور GetString به null؟ چیزی را اشتباه رفت. این احتمالا به معنی رشته است بیش از حد بزرگ، از کامپیوتر از حافظه است. این اتفاق می افتد فوق العاده، فوق العاده، فوق العاده به ندرت، اما می تواند اتفاق می افتد. ما می خواهیم برای آن را بررسی کنید، و همه ما در حال انجام است. از آنجا که ما در حال حاضر را مشاهده کنید، اگر شما نمی شروع چک کردن عادت برای همه چیز مثل تهی، شما ممکن است در واقع شروع به به آدرس در حافظه بی اعتبار می باشد. و شما شروع کنید به پیش ببرند بیشتر و بیشتر گسل تقسیم بندی. یا در مک و یا PC، فقط ایجاد یک کامپیوتر به چسبیدن به و یا برنامه ای برای مسدود کردن، به طور بالقوه. بنابراین در حال حاضر، من در کپی 0.c ادعا می کنند، که من رفتن به کپی این رشته ها از طریق از خط 28. و پس از آن، من قصد دارم ادعا در پایین در اینجا است که من قصد دارم یکی از آنها را تغییر دهید. بنابراین این اطلاع می دهد. من خواستار دوستان strlen قدیمی ما. و فقط به زبان انگلیسی توضیح آنچه این خط 34 در حال انجام است؟ چه تی براکت 0 نشان دهنده در سمت چپ. آره. رسید حرف اول از تی؟ DAVID J. مالان: شخصیت اول از تی. که در آن است. شخصیت اول از تی، من می خواهم به او واگذار نسخه بزرگ اولین حرف در تی. بنابراین این سرمایه گذاری حرف اول. و پس از آن، آخرین چیزی که من انجام در این برنامه این است که من ادعا می کنند در اینجا اصلی، این، و در اینجا کپی، تی است. اما بر اساس داستان ما فقط گفت در مورد آنچه که رشته واقعا هستند، خط 28 واقعا است انجام می دهند، و آنچه اشکال ناشی رفتن به بر روی صفحه نمایش می شود؟ پس اول، سوال اول، 28. چه رشته ای تی = واقعا انجام می دهند؟ اگر ما در سمت چپ دست اند سمت در اینجا رشته = t و بازدید کنندگان. که به من می دهد یک جعبه در اینجا و در یک جعبه اینجا. و فرض کنید این آدرس 0x نمایش است، اجازه دهید بگویم، 50 این زمان، خودسرانه. چه رشته ای تی = بازدید کنندگان در زیر هود انجام دهید؟ رسید [نامفهوم] DAVID J. مالان: این حافظه ذخیره می آدرس وجود دارد، بنابراین وجود دارد 0x50 می رود. بنابراین اگر در حال حاضر، من به اول شخصیت در t و حروف بزرگ آن، آنچه من به طور موثر به بازدید کنندگان انجام می دهند؟ من واقعا انجام همین کار، درست است؟ از آنجا که اگر آدرس 0x50-- و فقط، من اتاق بسیار در هیئت مدیره را در اینجا نیست، اما فرض کنیم که این است که در اینجا 0x50 پایین، جایی در حافظه کامپیوتر من است. و من، به عنوان مثال، گیب در اینجا کوچک، مثل این. و من گفته ام تی براکت 0 با حروف بزرگ می شود. خوب، تی براکت 0 است حرف اول در تی. بنابراین کمی گرم است که به تبدیل بزرگ G. اما مشکل است، چه ها نیز به نقطه؟ رسید همان. DAVID J. مالان: دقیقا همان. بنابراین یک توضیح ساده شاید، حتی اگر به نحو کمی عجیب و غریب است. بنابراین اجازه دهید این کار را انجام. ساخت کپی-0 و سپس ./copy-0. بگو چیزی: گیب. و متاسفانه، هر دو از آنها در حال حاضر با حروف بزرگ شده است، اما برای که زمینه ای دلیل است که ما به سادگی می در حال حاضر با آدرس خرید و فروش. پس ما چگونه به شروع address-- بدون جناس در intended-- چگونه ما شروع به رسیدگی این مشکل خاصی را دارد؟ خوب، در copy1.c، همه چیز به کمی پیچیده تر است. اما من یک ادعا راه حل مفهومی ساده است. خیلی سخته به در نگاه اول دریافت کنید. نه برای رفتن به آسان برای اولین زمانی که شما از آن نوع از، شاید، اما اگر مشکل این است که به سادگی انجام تی = فقط کپی آدرس، چه، دوباره اگر من می توانم در شما انتخاب کنید، در حال رفتن به راه حل برای در واقع کپی کردن یک رشته؟ رسید ما احتمالا دوباره با استفاده از یک حلقه. DAVID J. مالان: آره. بنابراین ما در حال رفتن به نیاز به یک حلقه دوباره. و از آنجایی که اگر ما می خواهید کپی کنید بازدید کنندگان رشته به رشته دیگر، ما احتمالا می خواهید این کار را انجام شخصیت های شخصیت. اما مشکل این است، اگر این اصل ها، در حال حاضر ما نیاز به شروع به صراحت تخصیص حافظه برای تی. به عبارت دیگر، اجازه دهید دوباره ترسیم این برای آخرین بار. اگر این رشته ها = GetString است. و اجازه دهید این قرار داده تا اینجا، و همچنین. این GetString است. و سپس، تصویر برای چیزی مانند که در حال رفتن به مانند قبل، گرم ب-الکترونیکی / 0. که به نظر می رسد چیزی کمی شبیه به این. و بازدید کنندگان به همین دلیل، ما به این 0x50، و که رفتن به 51، 52. بنابراین این 0x50 است. و پس از آن، من رشته تی. در حافظه، که فقط رفتن به من یک مربع کمی شبیه به این را. پس چه گام مهم در حال حاضر؟ اگر من می خواهم برای کپی کردن بازدید کنندگان به تن، چه خالی ما نیاز به پر کردن در اینجا؟ یا ما چه چیزی داریم به نیاز در سطح بالا انجام دهید؟ آره؟ کسی؟ آره. رسید ما به [نامفهوم] نیاز دارید. DAVID J. مالان: بله، ما نیاز به پر کردن در این قسمت را خالی. من نمی توانم کپی کنید و سپس سرمایه گذاری نام گیب است تا زمانی که من از سیستم عامل برای تکه دیگری از حافظه که حداقل به عنوان اصلی. به طوری که ما را با یک سوال. چگونه سیستم عامل بپرسید من فقط برای یک pointer-- ساده به عنوان این است که به نام، آدرس، pointer-- نمی برای یک جعبه ساده مثل این نام یک رشته؟ چگونه عامل درخواست I سیستم برای یک تکه بزرگ از حافظه؟ تا کنون، من تنها که پشت بدست به طور غیر مستقیم از طریق تماس GetString. پس چگونه است GetString حتی گرفتن حافظه خود را؟ خوب، آن را تبدیل وجود دارد که این تابع دیگر در اینجا که ما در حال حاضر شروع به استفاده کنید. در حال حاضر، این به نظر می رسد than-- راه مرموز تر و من تنها کسی بود که می توانید ببینید it-- هستم این خط به نظر می رسد راه مرموز تر سپس آن را در نگاه اول باید. اما اجازه دهید آن را به کسی را دست انداختن از هم جدا. در سمت چپ، من کاراکتر * تی. پس به زبان انگلیسی، اجازه دهید شروع به تدوین و فرموله جملات مناسب در اصطلاحات مخصوص یک صنف فنی. پس این است اختصاص متغیر از نوع char * به نام تی. در حال حاضر، چه چیزی را که واقعا چیست؟ خوب، این بدان معناست که، چی بگذارم در این متغیر به نام تی قرار داده است؟ آدرس یک کاراکتر. به طوری که فقط ساده تر، راه معقول تر توصیف در سمت چپ. به طوری که این کادر در اینجا تنها ایجاد می کند. بنابراین سمت راست، احتمالا، در جریان است را به خود اختصاص که بزرگتر تکه از حافظه چگونه؟ بنابراین اجازه دهید این کسی را دست انداختن از هم جدا. این قریب به اتفاق در نگاه اول، اما چه خبر است در داخل که اینجا هستید؟ ابتدا، malloc، وجود دارد که ظاهرا دوست جدید ما، "به حافظه اختصاص دهد." بنابراین این استدلال که گذشت است در آن، پس از آن یک استدلال بسیار بزرگ است. بنابراین اجازه دهید این کسی را دست انداختن از هم جدا. strlen از بازدید کنندگان، البته، نشان دهنده the-- رسید تعداد کاراکتر باشد. DAVID J. مالان: فقط تعداد کاراکتر در ثانیه. بنابراین طول ها، رشته اصلی است. بنابراین G-ب ه. پس از آن احتمالا چهار در این مورد. چرا من انجام +1 پس از تماس strlen از بازدید کنندگان؟ رسید [نامفهوم] DAVID J. مالان: برای که شخصیت تهی خاص. اگر شما از من بپرسید آنچه را که طول است نام گیب است، من می خواهم بگویم چهار. در قسمت پایین هود، هر چند، من نیاز که بایت پنجم برای شخصیت پوچ. به همین دلیل من انجام +1. در حال حاضر فقط در مورد شما در حال اجرا هستند این برنامه بر روی یک کامپیوتر دیگر از، می گویند، دستگاه CS50، که در آن به اندازه یک کاراکتر ممکن است متفاوت باشد از computer-- خود من معلوم است که من می توانم این تماس sizeof عملگر، فقط بخواهید کامپیوتر، چه به اندازه یک است کاراکتر در این کامپیوتر؟ و با ضرب پنج در این به عنوان مثال با به اندازه یک کاراکتر، که در اغلب کامپیوترها خواهد شد فقط یک، malloc است رفتن به اختصاص برای من این بزرگ تکه از حافظه بیش از اینجا در سمت راست. و آن را به return-- آن function-- است پس از آن رفتن به بازگشت به به من چه؟ رسید آدرس؟ DAVID J. مالان: آدرس از چه؟ رسید از حافظه را اختصاص داده؟ DAVID J. مالان: از حافظه آن اختصاص داده است. بنابراین من هیچ نظری ندارم، رک و پوست کنده، که در آن این است که برای پایان دادن به. من قصد دارم به پیشنهاد که آن را برای پایان دادن به در 0x88. کاملا خودسرانه است، اما جایی غیر از 0x50، چون سیستم عامل، چه ویندوز و سیستم عامل مک برای من انجام است، مطمئن شوید که آن را به من تکه های مختلف از RAM. بنابراین این ارزش که در آن این است تکه از حافظه ممکن است در نهایت. بنابراین این چیزی است که به پایان می رسد تا در اینجا، 0x88. بنابراین در حال حاضر به وضوح، من می توانم درک که این همان است که در این نیست، دلیل اینکه به آنها اشاره تکه های مختلف از حافظه است. بنابراین اگر من در حال حاضر در واقع می خواهید کپی کنید این در، بگذارید راه حل پیشنهادی خود را. اجازه دهید برود، ایجاد یک حلقه، و انجام آزمون t براکت من می شود بازدید کنندگان براکت من. از آنجا که در حال حاضر من می توانید استفاده کنید این نماد مانند آرایه، چرا که حتی اگر malloc بسیار عام من حافظه را اختصاص، حافظه بایت فقط به هم پیوسته است. بایت، بایت، بایت، پشت به پشت به پشت. من قطعا می تواند به عنوان یک برنامه نویس آن را به عنوان یک آرایه، که به معنی من می توانم این در نهایت آشنا استفاده نماد تنها برخی از براکت مربع است. بنابراین اجازه دهید من مکث وجود دارد، چرا این مقدار زیادی است همه در یک بار، حتی هر چند ایده اولیه به روکش که رشته است، تمام این مدت، یک نوع جدید داده به خودی نیست. این فقط یک اشاره گر به اصطلاح است، یک آدرس از یک شخصیت، که فقط به معنی آن است که یک تعداد است که یک قرارداد بشری ما تمایل به به عنوان 0x نمایش چیزی می نویسیم. اما این فقط یک عدد است، مانند 33 خیابان آکسفورد، که اتفاق می افتد به آدرس CS ساختمان. هر گونه سؤال در این جزئیات؟ آره؟ رسید چرا ما را بررسی کنید برای t برابر با تهی؟ DAVID J. مالان: چرا ما برای t برابر با null به؟ اگر ما به عنوان خوانده شده documentation-- question-- بزرگ برای malloc، آن را می گویند در چاپ خوب، گاهی اوقات ممکن است malloc بازگشت تهی، درست مثل GetString. و در واقع، GetString به null اگر، به نوبه خود، malloc null بر می گردد، چون GetString با استفاده از malloc. و این ممکن است در صورتی که سیستم عامل رخ می دهد، سیستم عامل مک، ویندوز، هر آنچه که است، به سادگی از حافظه را برای شما. بنابراین این چیزی است که وجود دارد اتفاق افتاده است. و اجازه دهید به یک چیز دیگر را نشان دهد که ممکن است فقط ضربه و ذهن شما یا به طور کامل بیش از حد بر روی خط باشد. اما اجازه بدهید من را بالا بکشد همین کار را برای حلقه برای کپی کردن، که یک لحظه پیش، فراخوان شد این. تی براکت من می شود بازدید کنندگان براکت من. زیبا و کاربر پسند. انگار هفته دو بار دیگر. اما این نسخه در واقع می تواند بازنویسی به عنوان این که به نظر می رسد مرموز. این روش به نام اشاره گر است حساب، آدرس حسابی. اما چرا این کار را می کند؟ در حال حاضر آزاردهنده، نویسندگان C تصمیم به استفاده از * نماد برای مقاصد مختلف. ما را دیده ام آن در حال حاضر مورد استفاده یک بار، * کاراکتر، که به معنی "من یک متغیر را که رفتن به شامل آدرس یک کاراکتر. " * بنابراین char در این زمینه به معنی "من یک متغیر را." متاسفانه، در صورت استفاده از * بدون یک کلمه در مقابل آن، مانند کاراکتر، که در حال حاضر به نام اپراتور ارجاع. و ما بیشتر از این قبل از اینکه طولانی را ببینید. اما این فقط به معنی "وجود دارد." این ضرب المثل مثل است، اگر کسی به من دادند بر روی یک تکه کاغذ "33 خیابان آکسفورد،" اگر من "* 33 خیابان آکسفورد،" این بدان معناست که "به پایین جاده به ساختمان CS." بنابراین * فقط به معنی وجود دارد اگر هیچ کلمه ای در مقابل آن وجود دارد. پس چه تی است، تا روشن شود؟ تی آدرس تکه از است حافظه که به من پشت داده شد. بازدید کنندگان آدرس از آنچه، به روشن باشد، در مثال ما بحث شده است، از گیب کوچک؟ بازدید کنندگان آدرس است of-- رسید رشته. DAVID J. مالان: از نام اصلی گیب است. پس از آن آدرس است این تکه از حافظه است. بنابراین اگر من می گویم تی + i-- من، اطلاع، فقط دوستان قدیمی ما است. این فقط یک متغیر شاخص است که تکرار از صفر در تا به طول رشته s. پس از آن برای رفتن به صفر، از یک، پس از آن دو، پس از آن سه، پس از آن چهار. بنابراین اجازه دهید این جمع جدید قطعات پازل مانند خراش، اگر شما خواهد شد، حتی اگر، دوباره، نحو به مراتب پیچیده تر از خراش. بنابراین تی یک آدرس + است من در حال رفتن به من می دهد تعداد، چرا که این همه اعداد است که ما به عنوان سحر و جادو رسم. اما آنها فقط اعداد هستند. بنابراین اگر آدرس تی ما گفت: بود 0x88، 0x88 چه به اضافه صفر است. حتی اگر شما راحت نیست با سحر و جادو در عین حال، یک حدس. رسید اصلی. DAVID J. مالان: هنوز 0x88. پس چه * 0x88 چیست؟ این بدان معنی است، "وجود دارد" که به معنی به طور موثر، "قرار دادن انگشت خود را در اینجا." و در حال حاضر در سمت راست این بیان، * و پس از آن در parens، بازدید کنندگان + من به معنی بازدید کنندگان است، که آدرس در اینجا از گرم کم است. بازدید کنندگان + 0 است، البته، این، هر آنچه که است. بنابراین در حال حاضر، آن را به بازدید کنندگان *، که درست مثل * 33 خیابان آکسفورد به معنای رفتن به آدرس است. بنابراین در اینجا این انگشت، دست راست است. پس چه هستم رفتن به کپی را به چه؟ چیزی که در سمت راست است که گیب، گرم کوچک، به اینجا. و به این ترتیب اثر است که تکرار اول حلقه، به شما به عنوان پیشنهاد، حتی اگر آن را به نظر می رسد دیوانه پیچیده تر از هر چیز ما قبل از دیده می شود، به سادگی گفت: بروید اینجا و کپی کردن است که شخصیت در اینجا. این شما با دادن یک نقشه به هر دو منطقه. و ما به مراتب بیشتر از این را ببینید. اما در حال حاضر، این امید است فقط به معرفی برخی از این ایده ها ساده است. و در واقع، اجازه دهید نگاهی به نگاه یک برنامه نهایی در اینجا، و پس از آن claymation وعده داده شده، که همه چیز درست خواهد شد. خوب. بنابراین، اجازه دهید باز up-- وجود دارد ما. بنابراین اجازه دهید me-- ما می آیند به این تصویر قبل از طولانی است. اجازه بدهید باز کردن این مثال نهایی در اینجا. بنابراین در اینجا فوق العاده، فوق العاده است برنامه ای است که انجام هیچ چیز در زندگی که به شرح زیر انجام می دهد. این برای اولین بار اعلام کرد که دو متغیر، ایکس و y، که تعداد این زمان، در هر سه. آنها اعداد صحیح نیست، در هر سه. آنها به ظاهر اعضای هیات *. پس فقط هر کسی، به چه معناست اگر نوع داده های خود، متغیر خود را، است از نوع int * ستاره؟ این آدرس از یک int است. بنابراین من هیچ ایده که در آن است هنوز. این فقط به معنی "قرار داده، در نهایت، آدرس یک int است. " 0x50، 0x88، هر جا آن را در است حافظه، یک آدرس است که وجود دارد. و این چیزی است که سالانه است رفتن به، و همچنین. اگر من در حال حاضر می گویند x = malloc (sizeof (هوشمند))، این یک راه فانتزی گفتن است، سلام سیستم عامل، از طریق malloc، من حافظه به اندازه کافی برای اندازه از یک int، که احتمالا رفتن به 32 بیت یا چهار بایت. پس چه malloc بازگشت؟ Malloc یک آدرس گرداند. بنابراین آنچه که به در x ذخیره می شود؟ آدرس تکه از حافظه، از چهار بایت، که malloc فقط برای من با درخواست پیدا نشد سیستم عامل. در حال حاضر در عین حال، خط چهار در اینجا، * x = 42. فقط به روشن، چه خبر است پایین وجود دارد؟ در سمت چپ، * x است. که مانند * 33 خیابان آکسفورد است. بنابراین * X یعنی چه؟ رسید برو به. DAVID J. مالان: برو به این آدرس. هر جا که تکه حافظه است، به آن. و آنچه وجود دارد، بدیهی است؟ رسید 42. DAVID J. مالان: 42. همه حق است، * و y، همان ایده. برو به آدرس را در y است. تعداد 13 قرار داده وجود دارد، اما آنچه سالانه در حال حاضر است؟ رسید هیچ حافظه وجود دارد برای y است. DAVID J. مالان: وجود دارد بدون حافظه برای y است. پس چه سالانه انجام می دهد احتمالا باشد، به عنوان گفته ایم که؟ رسید زباله. DAVID J. مالان: برخی از ارزش زباله. در حال حاضر، ارزش زباله است که هنوز هم یک عدد است. این هنوز هم می تواند برای یک آدرس اشتباه گرفته شود. آن را به عنوان هر چند کسی است چیزی نوشته پایین، و من آن را به عنوان معنی بد تفسیر برخی از ساختمان در خیابان. و اگر شما فقط سعی کنید برای رفتن به برخی از ساختمان متعلق به شما نیست، و یا برخی از تکه از حافظه شما ندارد داده شده است، همه چیز بد ممکن است رخ دهد. کامپیوتر ممکن است به سقوط، و یا برخی دیگر رفتار نامشخص ممکن است رخ دهد. بنابراین مقدمه، پس از آن، به Binky این است. من هنوز هم به یاد داشته باشید، 20 چند سال بعد عجیب و غریب، که در آن I زمانی که من در نهایت بود اشاره گر قابل درک باشد. کدام می گویند، اگر شما ترک در اینجا در سه دقیقه و فکر می کنم من نمی درک اشاره گر، متوجه من برای 20 به یاد سال برای برخی از دلیل دیوانه هنگامی که و به همین دلیل آن را در نهایت غرق شده در، نشسته با آموزش من همکار، Nishat مهتا در پشت سالن ناهار خوری الیوت. در حال حاضر، من به یاد ام این به دلیل این بود یکی از موضوعات I، در خاص، با مشکلاتی مواجه شد. و سپس، آن را در نهایت کلیک، مثل من به جرات می گفت بسیاری از مباحث در نهایت خواهد شد. و در حال حاضر، را که احساس می کنند همه شادتر و قانع کننده همه بیشتر، اجازه دهید نگاهی به نهایی در ما سه دقیقه گذشته اینجا در Binky، از دوستان ما، نیک Parlante از دانشگاه استنفورد. [VIDEO پخش] -Hey، Binky. از خواب بیدار شوید! این زمان برای اشاره گر سرگرم کننده است. چه که؟ اطلاعات در مورد اشاره گر؟ اوه، بسیار خوب! خوب، برای شروع، من حدس می زنم ما نیاز به رفتن به یک زن و شوهر اشاره گر. -OK. این کد اختصاص دو اشاره گر، که می تواند به اعداد صحیح اشاره نمود. -OK. خوب، من این دو اشاره گر، اما آنها به نظر نمی رسد به اشاره به هر چیزی. یعنی درست است. در ابتدا، اشاره گر به هر چیزی اشاره نشده است. چیزهایی را که به گفته می شود اشاره pointees، و راه آنها را در یک گام جداگانه. اوه، درست است، درست است. من می دانستم که. pointees جدا هستند. استروژن، پس چگونه می توانم به شما اختصاص pointee؟ -OK. خوب، این کد اختصاص pointee عدد صحیح جدید، و این مجموعه بخشی x به اشاره به آن است. -Hey، که به نظر می رسد بهتر است. بنابراین، آن را به انجام کاری. -OK. من ارجاع ایکس اشاره گر به ذخیره تعداد 42 به pointee آن است. برای این ترفند، من نیاز من سحر و جادو ترکه از غیر مرجع. سحر و جادو ترکه همراه خود از غیر مرجع؟ That-- فوق العاده است. -این چیزی است که کد به نظر می رسد. من فقط راه اندازی تعداد، و [POP] -Hey، نگاه کنید. وجود دارد از آن می رود. -So انجام یک ارجاع در ایکس شرح زیر است فلش برای دسترسی به pointee آن است. در این مورد، یک فروشگاه 42 در آن وجود دارد. با سلام با استفاده از آن برای ذخیره تعداد را امتحان کنید 13 از طریق اشاره گر دیگر، y است. -OK. من فقط بیش از اینجا به y، و تعداد 13 مجموعه. و پس از آن، گرفتن ترکه از غیر مرجع و فقط [BUZZ] اوه! اوه، سلام! که کار نمی کند. بگو، Binky، من فکر نمی کنم هرگاه سالانه یک ایده خوب است، چرا که شما می دانید، راه اندازی pointee یک گام جداگانه است. و من فکر نمی کنم که ما تا کنون آن را انجام داد. نقطه -Good. آره. ما اختصاص داده سالانه اشاره گر است، اما ما هرگز آن را به نقطه را به pointee. -Very ناظر. -Hey، شما به دنبال خوب وجود دارد، Binky. آیا می توانید آن را تعمیر به طوری که نقاط سالانه به pointee همانند x؟ -Sure. من سحر و جادو ترکه من استفاده کنید از واگذاری اشاره گر. -Is که برای رفتن به یک مشکل مثل قبل؟ -No. این به این pointees را لمس کنید. این فقط تغییر یک اشاره گر به اشاره به همان چیزی که به عنوان یکی دیگر. آه، من را ببینید. در حال حاضر نقاط سالانه به همان محل به عنوان ایکس. پس صبر کنید. در حال حاضر، سالانه ثابت است. از آن است که pointee. بنابراین شما می توانید ترکه از سعی غیر مرجع دوباره به ارسال بیش از 13. -Uh، OK. در اینجا از آن می رود. [POP] -Hey، در آن نگاه کنید. در حال حاضر هرگاه آثار در سال. و از آنجایی که اشاره گر به اشتراک گذاری که یکی pointee، آنها هر دو 13 را ببینید. آره. به اشتراک گذاری، هر آنچه. بنابراین می خواهیم به تغییر مکان در حال حاضر؟ اوه، نگاه کنید. ما از زمان. -But-- دقیقا وقتی سه قانون اشاره گر به یاد داشته باشید. شماره یک، ساختار پایه است که شما یک اشاره گر، و آن را اشاره به pointee. اما اشاره گر و pointee جدا هستند، و خطای رایج است به راه اندازی یک اشاره گر، اما فراموش نکنید که به آن pointee دهد. شماره دو، غیر مرجع اشاره گر شروع می شود در اشاره گر و زیر فلش خود را بیش از برای دسترسی به pointee آن است. همانطور که همه ما می دانیم، این فقط در صورتیکه وجود دارد pointee، که نوع می شود به اصل شماره یک. شماره سه، اشاره گر انتساب طول می کشد یک اشاره گر و تغییر آن به نقطه را به همان pointee به عنوان اشاره گر دیگر. بنابراین پس از انتساب، دو اشاره گر به pointee همان نقطه. گاهی اوقات، که به اشتراک گذاری نامیده می شود. و این همه به آن وجود دارد، واقعا. خداحافظ خداحافظی کن. [END VIDEO پخش] DAVID J. مالان: که در آن است برای CS50. ما شما را در هفته آینده را ببینید.