>> [موسیقی]
>> داگ لوید: اشاره گرها، در اینجا ما می باشد.
این است که احتمالا رفتن به بود که موضوع سخت ترین
که ما در مورد در CS50 صحبت کنید.
و اگر شما را خوانده ام هر چیزی در مورد اشاره گر
قبل از اینکه شما ممکن است یک کمی تهدید آمیز رفتن به این فیلم.
این درست است که اشاره گرها آیا شما اجازه می دهد توانایی
شاید پیچ ​​کردن بدی زمانی که شما
کار با متغیرها، و داده ها، و ایجاد برنامه های خود را به سقوط.
اما آنها در واقع واقعا مفید و آنها به ما یک راه بسیار خوبی اجازه می دهد
به تصویب داده ها به عقب و بین توابع،
که ما غیر این صورت قادر به انجام است.
>> و بنابراین، آنچه ما واقعا در اینجا می خواهم به انجام قطار است
شما را به نظم و انضباط اشاره گر خوب، به طوری که شما می توانید به طور موثر استفاده از اشاره گر
به برنامه های خود را که بسیار بهتر است.
همانطور که گفتم اشاره گر را به ما بدهید مختلف راهی برای عبور داده ها بین توابع.
حال اگر شما از یاد ویدئو قبل، زمانی که
صحبت کردیم دامنه متغیر، من ذکر
که تمام داده که ما بین تصویب توابع در C است با مقدار منتقل.
و من ممکن است استفاده کرده اند نیست که مدت، من به معنای وجود دارد
این بود که ما در حال عبور از کپی از داده ها.
هنگامی که ما یک متغیر تصویب به یک تابع، ما در واقع عبور از متغیر نیست
به تابع، درست است؟
ما در حال عبور یک کپی از که داده به تابع.
کارکرد به آن چه خواهد شد و آن را محاسبه برخی از ارزش،
و شاید استفاده می کنیم که ارزش هنگامی که آن را آن را می دهد تماس.
>> بود یک استثنا وجود دارد این قانون از عبور از با ارزش،
و ما به آنچه که می آیند کمی بعد در این فیلم است.
اگر ما به جای استفاده از اشاره گر از استفاده از متغیرها،
و یا به جای استفاده از متغیرهای خود یا نسخه هایی از متغیرها،
ما در حال حاضر می تواند عبور متغیرهای اطراف بین توابع در راه های مختلف.
این به این معنی است که اگر ما را تغییر در یک تابع،
که در واقع تغییر خواهد اثر در یک تابع های مختلف.
باز هم، این چیزی است که ما نمی تواند قبلا انجام دهید،
و اگر شما همیشه سعی کردم به مبادله ارزش دو متغیر در یک تابع،
شما متوجه شده ام این مشکل مرتب کردن بر اساس خزنده تا، درست است؟
>> اگر ما می خواهیم به مبادله X و Y، و ما تصویب آنها را به یک تابع به نام مبادله،
در داخل تابع مبادله متغیرهای انجام مبادله پول است.
یکی می شود دو، دو می شود یکی است، اما ما در واقع نه
تغییر هر چیزی در اصلی تابع، در تماس گیرنده.
چون ما نمی توانیم، ما تنها کار با نسخه از آنها را.
با اشاره گر چند، ما می توانیم در واقع عبور X و Y به یک تابع.
این تابع می توانید انجام دهید چیزی با آنها.
و کسانی که ارزش متغیرهای در واقع می تواند تغییر دهید.
به طوری که کاملا یک تغییر در این توانایی ما برای کار با داده ها.
>> قبل از اینکه ما به شیرجه رفتن اشاره گرها، من فکر می کنم آن را به ارزش
در نظر گرفتن چند دقیقه به بازگشت به اصول است.
و نگاهی به چگونگی آثار حافظه کامپیوتر
چرا که این دو موضوع در حال رفتن به واقع بسیار مرتبط است.
همانطور که شما احتمالا می دانید، روی سیستم کامپیوتر شما
شما یک هارد دیسک و یا شاید یک درایو حالت جامد،
نوعی از محل ذخیره سازی فایل.
آن را معمولا در جایی در محله 250 گیگابایت
به شاید چند ترابایت در حال حاضر.
و آن را که در آن همه خود را فایل های در نهایت زندگی می کنند،
حتی زمانی که کامپیوتر شما بسته شده است ، شما می توانید آن را به عقب به نوبه خود
و شما پیدا کردن فایل های خود را وجود دارد دوباره زمانی که شما سیستم خود را راه اندازی مجدد.
اما هارد دیسک، مانند یک درایو دیسک سخت، یک هارد دیسک، و یا یک درایو حالت جامد، یک SSD،
فضای ذخیره سازی هستند فقط.
>> ما در واقع نمی تواند انجام هر کاری با داده ها است که در هارد دیسک،
و یا در یک درایو حالت جامد.
به منظور در واقع تغییر داده ها و یا حرکت در اطراف،
ما باید به این حرکت را به RAM، حافظه با دسترسی تصادفی.
در حال حاضر RAM، شما یک مقدار زیادی کمتر از در کامپیوتر شما.
شما ممکن است در جایی در اند محله 512 مگابایت
اگر شما یک کامپیوتر قدیمی، شاید دو، چهار، هشت، 16،
احتمالا حتی یک کمی بیشتر، گیگابایت رم.
به طوری که بسیار کوچکتر است، اما این که در آن تمام داده های فرار وجود دارد.
تا جایی که ما می توانید همه چیز را تغییر دهید.
اما زمانی که ما کامپیوتر ما را خاموش کنید، تمام داده ها در حافظه تخریب شده است.
>> به همین دلیل ما نیاز به هارد دیسک برای محل دائمی بیشتر از آن،
به طوری که آن را exists- آن واقعا بد اگر هر زمان که ما
کامپیوتر ما خاموش، هر فایل در سیستم ما محو شده بود.
بنابراین ما در داخل RAM کار می کنند.
و هر زمان که ما در حال صحبت کردن در مورد حافظه، بسیار زیاد است، در CS50،
ما در حال صحبت کردن در مورد RAM، هارد دیسک نیست.
>> تا زمانی که ما حرکت همه چیز را به حافظه، طول می کشد تا یک مقدار مشخصی از فضا است.
همه انواع داده ای که ما در حال همکاری با
تا مختلف مقدار فضا در RAM.
بنابراین هر زمان شما یک عدد صحیح ایجاد متغیر، چهار بایت از حافظه
به کناری در RAM به طوری که شما می توانید با آن عدد صحیح کار می کنند.
شما می توانید عدد صحیح اعلام، آن را تغییر دهید، به آن اختصاص دهید
به یک مقدار 10 واحد اضافه به یک، به همین ترتیب و غیره.
تمام آنچه که باید در اتفاق می افتد رم، و شما می توانید چهار بایت
برای کار با برای هر عدد صحیح است که شما ایجاد کند.
>> هر شخصیت شما ایجاد می شود یک بایت.
است که فضای چقدر است مورد نیاز برای ذخیره یک شخصیت.
هر شناور، واقعی تعداد، می شود چهار بایت
مگر اینکه آن را دو برابر دقت ممیز شناور
شماره، که اجازه می دهد تا به شما از ارقام دقیق تر یا بیشتر
بعد از نقطه اعشار بدون از دست دادن دقت،
که را تا هشت بایت از حافظه است.
طولانی مشتاق، اعداد صحیح واقعا بزرگ است، نیز تا هشت بایت از حافظه است.
چگونه بسیاری از بایت حافظه انجام رشته را تا؟
خوب اجازه دهید یک سنجاق در سوال قرار داده در حال حاضر، اما ما به آن آمده است.
>> بنابراین به این ایده از حافظه به عنوان یک آرایه بزرگ از سلول بایت اندازه.
که واقعا همه چیز در آن است، آن را فقط یک آرایه بزرگ از سلول ها،
درست مانند هر آرایه دیگری که شما با آن آشنا هستید و ببینید،
به جز هر عنصر یک بایت گسترده است.
و درست مثل یک آرایه، هر عنصر دارای یک آدرس.
هر عنصر از یک آرایه دارای یک شاخص، و ما
می توانید که شاخص به انجام به اصطلاح استفاده دسترسی تصادفی در آرایه.
ما لازم نیست برای شروع در آغاز از آرایه،
تکرار از طریق هر عنصر آن،
برای پیدا کردن آنچه ما دنبال آن هستید.
فقط می توانیم بگوییم، من می خواهم برای رسیدن به عنصر 15 و یا عنصر 100.
و شما فقط می توانید در این تعداد عبور و بدست آوردن مقدار شما دنبال آن هستید.
>> به طور مشابه هر محل در حافظه دارای یک آدرس.
بنابراین شما ممکن است حافظه چیزی شبیه به این.
در اینجا یک تکه کوچک از این بسیار حافظه، این 20 بایت از حافظه است.
20 بایت اول به خاطر من آدرس وجود دارد در پایین
0، 1، 2، 3، و غیره در تمام راه را تا 19.
و وقتی که من متغیرهای اعلام و زمانی که من شروع به کار با آنها،
سیستم در حال رفتن به مجموعه کنار برخی از فضا برای من
در این حافظه به کار با متغیرهای من.
بنابراین من ممکن است بگویید، کاراکتر C برابر سرمایه H. و چه اتفاقی خواهد افتاد؟
خوب سیستم است که به را کنار بگذارند برای من یک بایت.
در این مورد آن تعداد بایت انتخاب چهار، بایت به آدرس چهار،
و آن را برای ذخیره H سرمایه حرف در وجود دارد برای من.
پس اگر من می گویند سرعت INT حد برابر 65، آن را
رفتن به کنار بگذارند چهار بایت حافظه برای من.
و آن را برای درمان کسانی چهار بایت به عنوان یک واحد
زیرا آنچه که ما در حال کار با یک عدد صحیح در اینجا است.
و آن را برای ذخیره در 65 وجود دارد.
>> در حال حاضر در حال حاضر من از نوع هستم گفتن شما یک بیت از یک دروغ،
راست، زیرا می دانیم که کامپیوتر در باینری کار می کنند.
آنها درک نمی کنند لزوما چه H سرمایه است
و یا چه 65 است، فقط آنها درک باینری، صفر و آنهایی که.
و به این ترتیب در واقع آنچه ما در حال ذخیره سازی در آن وجود دارد
است که حرف H و عدد 65 نیست، بلکه مبنای دودویی
آن که نگاه چیزی کمی شبیه به این.
و به ویژه در متن متغیر عدد صحیح،
آن را نه فقط به آن را تف به، آن را نمی آن را به عنوان یکی از چهار
تکه بایت لزوما، آن را در واقع رفتن
آن را به عنوان یکی از چهار تکه بایت، که ممکن است چیزی شبیه به این.
و حتی این است که کاملا درست هم،
چون از چیزی به نام endianness، که ما نه
رفتن به به در حال حاضر، اما اگر شما کنجکاو در مورد،
شما می توانید بخوانید تا در کمی و endianness بزرگ است.
اما به خاطر این استدلال، به خاطر این فیلم،
اجازه دهید فقط فرض کنیم که، در واقع، چگونه شماره 65 می
در نمایندگی حافظه در هر سیستم،
هر چند آن را کاملا درست نیست.
>> اما اجازه دهید در واقع فقط از همه باینری به طور کامل از شر،
و فقط در مورد به عنوان H فکر می کنم و 65، آن را بسیار ساده تر
در مورد آن فکر می کنم مثل که به عنوان یک انسان است.
همه حق است، پس از آن نیز به نظر می رسد شاید یک کمی تصادفی که I've- سیستم من
من بایت 5، 6، 7 را نمی دهد، و 8 برای ذخیره عدد صحیح است.
یک دلیل برای آن وجود دارد، بیش از حد، که ما نمی خواهد به در حال حاضر، اما کافی
آن را به می گویند که چه کامپیوتر در حال انجام در اینجا
است که احتمالا یک حرکت خوب در بخشی از آن.
به من حافظه که نمی دهد لزوما به بازگشت بازگشت.
هر چند که رفتن به آن را در حال حاضر اگر من می خواهم به یکی دیگر از رشته،
نام نام خانوادگی، و من می خواهم برای قرار دادن لوید در آن وجود دارد.
من قصد دارم به نیاز به یک جا شخصیت، هر حرف از این که
رفتن به نیاز به یک شخصیت، یک بایت از حافظه است.
بنابراین اگر من می تواند لوید به آرایه من قرار داده مثل این من خیلی خوب برای رفتن، حق با من؟
چیزی که گم؟
>> به یاد داشته باشید که هر رشته کار ما با در C با بک اسلش صفر به پایان می رسد،
و ما می توانیم را حذف نمی کند که در اینجا، یا.
ما نیاز به یک بایت را کنار بگذارند از حافظه را به نگه دارید که بنابراین ما
می دانم زمانی که رشته ما به پایان رسیده است.
پس دوباره این ترتیب از راه چیزهایی
به نظر می رسد در قدرت حافظه یک کمی تصادفی،
اما در واقع این است که چگونه اکثر سیستم های طراحی شده اند.
به خط آنها را در تقسیم عددی بر مضرب از چهار، به دلایل دوباره
که ما لازم نیست به مناسب دریافت کنید.
اما این، پس از آن کافی است بگوییم که پس از این سه خط کد،
این چیزی است که حافظه ممکن است مانند نگاه.
اگر من مکان حافظه نیاز 4، 8، و 12 برای نگهداری داده من،
این چیزی است که حافظه من ممکن است مانند نگاه.
>> و فقط به ویژه شود موشکاف در اینجا، هنگامی که
ما در حال صحبت کردن در مورد حافظه آدرس ما معمولا
انجام این کار با استفاده از نمادهای مبنای شانزده است.
پس چرا ما همه از این تبدیل از دهدهی به مبنای شانزده
فقط به خاطر اینکه که به طور کلی چگونه ما به حافظه مراجعه کنید.
بنابراین به جای این که از طریق 0 19، آنچه که ما صفر است
X صفر تا صفر X1 سه.
کسانی که 20 بایت از حافظه است که ما اند و یا ما به دنبال در در این تصویر
درست همین جا.
>> بنابراین همه که می شود گفت، اجازه دهید گام به دور از حافظه را برای یک ثانیه
و به اشاره گر.
در اینجا است که مهم ترین چیزی به خاطر داشته باشید
همانطور که ما شروع به کار با اشاره گر.
یک اشاره گر هیچ است بیش از یک آدرس.
من دوباره آن را می گویند به دلیل آن است که مهم است،
یک اشاره گر هیچ است بیش از یک آدرس.
اشاره گرها آدرس به مکان در حافظه که در آن متغیرهای زندگی می کنند.
آگاهی از این که آن را تبدیل به امیدوارم کمی آسان تر به کار با آنها.
چیز دیگری که من دوست دارم به انجام است که مرتب سازی بر اساس
نمودار بصری، چه اتفاق می افتد با خطوط مختلف از کد.
و ما این را یک زن و شوهر انجام بار در اشاره گرها،
و هنگامی که ما در مورد صحبت های پویا تخصیص حافظه است.
از آنجا که من فکر می کنم که این نمودار می تواند بسیار سودمند.
>> بنابراین اگر من برای مثال می گویند، اعضای هیات K در کد من، آنچه اتفاق می افتد؟
خب چه اساسا اتفاق می افتد من گرفتن حافظه کنار گذاشته برای من تعیین می کنند،
اما من حتی به دوست ندارد فکر می کنم در مورد آن مانند آن، من
دوست دارم در مورد آن فکر می کنم مثل یک جعبه.
من یک جعبه و آن را سبز رنگ چون من
می توانید اعداد صحیح در جعبه سبز قرار داده است.
اگر آن را یک شخصیت من ممکن است یک جعبه آبی داشته باشد.
اما من همیشه می گویند، اگر من ایجاد یک جعبه است که می تواند اعداد صحیح نگه
که جعبه سبز رنگ شده است.
و من یک نشانگر دائمی و من ک ارسال در کنار آن است.
بنابراین من یک جعبه به نام K، به که من می توانم اعداد صحیح قرار داده است.
بنابراین، هنگامی که من می گویم INT K، که چه در سر من اتفاق می افتد.
اگر من می گویم ک برابر پنج، چه هستم من انجام می دهند؟
خب، من قرار دادن پنج در کادر، درست است.
این بسیار ساده است، اگر من می گویم INT K، ایجاد یک جعبه به نام K.
اگر من می گویم K برابر با 5، قرار دادن پنج را در جعبه.
امیدوارم که بیش از حد از یک جهش است.
اینجا جایی است که همه چیز را به یک کمی جالب است.
اگر من می گویم نوع int * PK، و حتی اگر من می دانید چه این به این معناست،
این دقیقا چیزی رو برای انجام با یک عدد صحیح.
بنابراین من قصد دارم به رنگ از این کادر سبز حرکت،
من می دانم که آن چیزی کردم برای انجام با یک عدد صحیح،
اما آن را یک عدد صحیح خود نیست، به دلیل آن یک ستاره بین المللی است.
چیزی وجود دارد کمی مختلف در مورد آن.
مشارکت یک عدد صحیح است، اما در غیر این صورت آن را
خیلی متفاوت از نه آنچه ما در مورد صحبت می کردند.
این یک جعبه است، آن هم یک برچسب، آن را با پوشیدن یک PK برچسب،
و آن را قادر به برگزاری ستاره بین المللی، هر آن می باشد.
آنها چیزی برای انجام با اعداد صحیح، به وضوح.
در اینجا چند خط آخر است.
اگر من می گویم PK = & K، ایست، چه چیزی اتفاق افتاده، درست است؟
بنابراین این عدد تصادفی، به ظاهر تصادفی تعداد، می شود در صندوق ریخته است.
همه این است که، PK است می شود آدرس K.
بنابراین من چسبیده که در آن k در حافظه زندگی می کند، آدرس آن، آدرس بایت آن است.
همه من انجام من گفت: که ارزش آن چیزی است که من قصد دارم
به داخل جعبه من به نام PK قرار داده است.
و از آنجایی که این چیزها اشاره گرها، و به همین دلیل به دنبال
در یک رشته مانند X صفر هشت صفر C هفت چهار هشت
دو صفر است که احتمالا بسیار معنی دار.
هنگامی که ما به طور کلی تجسم اشاره گر، ما در واقع انجام این کار به عنوان اشاره گر.
PK به ما می دهد اطلاعات ما نیاز به پیدا K در حافظه است.
بنابراین اساسا PK است فلش در آن است.
و اگر ما طول راه رفتن که فلش، تصور کنید
آن چیزی است که شما می توانید راه رفتن بر روی، اگر ما راه رفتن در امتداد طول فلش،
در نوک پیکان که، ما را از محل در حافظه پیدا
که در آن k زندگی می کند.
و این واقعا مهم چرا که یک بار ما می دانیم که در آن k زندگی می کند،
ما می توانیم شروع به کار با داده ها در داخل از آن محل حافظه.
هر چند که ما در حال گرفتن کوچک جلوتر از خودمان برای کمی.
>> پس چه یک اشاره گر است؟
یک اشاره گر از قلم داده است که ارزش یک آدرس حافظه است.
که بود که X صفر هشت چیزهای صفر در رفتن، که یک آدرس حافظه بود.
که یک محل در حافظه بود.
و نوع اشاره گر توصیف نوع
داده شما را در پیدا کردن آن آدرس حافظه.
بنابراین ستاره بین المللی قسمت سمت راست وجود دارد.
اگر من به دنبال که فلش، آن را رفتن به من منجر به یک مکان.
و آن مکان، آنچه که من وجود دارد در مثال من پیدا خواهد کرد،
یک جعبه سبز رنگ است.
این یک عدد صحیح است، این چیزی است که من را پیدا خواهد کرد اگر من به این آدرس بروید.
نوع داده ها از یک اشاره گر توصیف آنچه
شما در آن آدرس حافظه پیدا کنید.
بنابراین در اینجا چیزی که واقعا جالب هر چند.
اشاره گرها به ما اجازه عبور متغیرها بین توابع.
و در واقع متغیرهای عبور و کپی از آنها عبور نمی کند.
چرا که اگر ما دقیقا می دانند که در حافظه برای پیدا کردن یک متغیر،
ما لازم نیست برای ایجاد یک کپی از آن، ما فقط می توانید به آن مکان بروید
و کار با آن متغیر است.
بنابراین در اشاره گر جوهر مرتب سازی بر از یک محیط کامپیوتر را
خیلی بیشتر مانند جهان واقعی، درست است.
>> بنابراین در اینجا یک مقایسه است.
اجازه دهید بگویم که من یک نوت بوک، راست، و آن را پر از یادداشت ها.
و من می خواهم شما را به آن به روز رسانی.
شما یک تابع است که یادداشت روز رسانی، درست است.
در راه ما شده است کار تا کنون، چه
اتفاقی می افتد شما خواهد نوت بوک من را، شما را به فروشگاه اینترنتی کپی بروید،
شما یک کپی زیراکس خواهید هر صفحه از نوت بوک.
شما نوت بوک من تماس ترک بر روی میز من زمانی که شما انجام می شود،
شما بروید و عبور از همه چیز در من نوت بوک است که خارج از تاریخ و یا در اشتباه هستند،
و سپس شما را به تصویب من پشته از صفحات زیراکس
که یک کپی از نوت بوک من با تغییراتی که شما را به آن ساخته شده است.
و در آن نقطه، آن را تا به من به عنوان تابع فراخوانی، به عنوان تماس گیرنده،
برای تصمیم گیری به یادداشت های خود را و ادغام آنها را به نوت بوک من.
بنابراین در بسیاری از مراحل وجود دارد درگیر در اینجا، درست است.
دوست ندارم می شود بهتر است آن را اگر من فقط می گویند، هی، می تواند شما
به روز رسانی نوت بوک من برای من، شما دست نوت بوک من،
و شما را همه چیز و به معنای واقعی کلمه عبور آنها
و به روز رسانی یادداشت های من در نوت بوک من.
و سپس به من نوت بوک من را به عقب.
این نوع از چیزی است که اشاره گر به ما اجازه انجام،
آنها را از این محیط زیادی بیشتر شبیه چگونه ما در واقعیت به کار گیرند.
>> همه حق به طوری که چه یک اشاره گر است، اجازه دهید صحبت
در مورد چگونگی اشاره گرها در C کار می کنند، و چگونه ما می توانیم شروع به کار با آنها.
بنابراین یک اشاره گر بسیار ساده وجود دارد در C به نام اشاره گر تهی.
نقاط اشاره گر تهی به هیچ چیز.
این احتمالا به نظر می رسد مانند آن را در واقع نه چیزی که بسیار مفید،
اما ما به عنوان یک دید کمی بعد در، این واقعیت است
که این اشاره گر تهی وجود دارد در واقع واقعا می تواند در مفید آمده است.
و هر زمان که شما یک اشاره گر، ایجاد و شما immediately- ارزش خود را تنظیم نشده
یک مثال از تنظیم ارزش خود را بلافاصله
خواهد شد چند اسلاید تماس که در آن من گفت PK برابر & K،
PK می شود آدرس K، به عنوان خواهیم دید که چه معناست،
خواهیم دید که چگونه به کد که shortly- اگر ما ارزش خود را به چیزی تنظیم نشده
بلافاصله معنی دار، شما همیشه باید
مجموعه ای اشاره گر خود را به نقطه به تهی.
شما باید آن را به نقطه به هیچ چیز.
>> که بسیار متفاوت از فقط ترک ارزش آن را به عنوان
و پس از آن اعلام اشاره گر و فقط فرض
آن را تهی چرا که به ندرت درست است.
بنابراین شما همیشه باید تنظیم ارزش یک اشاره گر
به تهی اگر شما ارزش خود را تنظیم نشده به چیزی معنی دار بلافاصله.
شما می توانید بررسی کنید که آیا ارزش یک اشاره گر تهی است با استفاده از عملگر برابری
(==)، درست مثل شما مقایسه هر عدد صحیح ارزش ها یا ارزش شخصیت با استفاده از (==)
به خوبی.
این یک نوع خاص از ثابت است ارزش است که شما می توانید استفاده کنید برای تست.
به طوری که یک بسیار ساده اشاره گر، اشاره گر تهی.
راه دیگر برای ایجاد یک اشاره گر است که برای استخراج
آدرس یک متغیر شما در حال حاضر ایجاد کرده اید،
و شما این کار را با استفاده از & استخراج آدرس اپراتور.
که ما در حال حاضر قبلا دیده در مثال اول نمودار من نشان داد.
بنابراین اگر x یک متغیر که ما این است در حال حاضر از نوع عدد صحیح، و
پس از آن و X اشاره گر به یک عدد صحیح است.
& X است- یاد داشته باشید، و در حال رفتن به استخراج آدرس از چیزی که در سمت راست.
و از آنجایی که یک اشاره گر فقط یک آدرس است، از & X یک اشاره گر به یک عدد صحیح است
ارزش که در آن در زندگی حافظه x است.
این آدرس X را دارد.
بنابراین & X آدرس x است.
اجازه بدهید این یک گام بیشتر و اتصال به چیزی
من به در یک ویدیو قبل اشاره کرد.
اگر ARR آرایه ای از دو برابر است، پس از آن و براکت ARR من یک اشاره گر است
به دو برابر شود.
باشه.
ورود براکت من، اگر ورود آرایه ای از دو برابر است،
پس از آن ورود براکت من است عنصر i ام که آرایه،
و و ورود براکت من است که در آن در حافظه عنصر i ام از ورود وجود دارد.
>> بنابراین چه مفهوم در اینجا؟
نام آرایه، مفهوم از این که کل آن،
است که نام یک آرایه است در واقع خود را یک اشاره گر.
شما مشغول به کار با اشاره گر در تمام طول
هر بار که شما یک آرایه استفاده می شود.
به یاد داشته باشید از مثال در حوزه دید متغیر،
در نزدیکی پایان این ویدئو من در حال حاضر یک مثال که در آن ما باید یک تابع
نام INT مجموعه و یک تابع به نام آرایه مجموعه ای.
و به چالش کشیدن خود را برای تعیین یا نه، و یا چه
ارزش هایی که ما چاپ در پایان از عملکرد،
در پایان برنامه اصلی.
>> اگر شما از این مثال به یاد و یا اگر شما این ویدئو را تماشا کرده ام،
شما می دانید که هنگامی که شما- تماس به مجموعه ای از نوع int به طور موثر انجام نمی دهد.
اما پاسخ به مجموعه ای از آرایه می کند.
و من از روی همین دلیل یشمی که در این مورد در آن زمان بود.
من فقط گفتم، خوب که این آرایه، آن را ویژه، شما می دانید، یک دلیل وجود دارد.
دلیل این است که یک آرایه نام و نام خانوادگی است که واقعا فقط یک اشاره گر،
و این ویژه ای وجود دارد استفاده از دستور براکت که
همه چیز را خیلی بهتر برای کار با.
و آنها را این ایده از یک اشاره گر بسیار کمتر تهدید آمیز،
و به همین دلیل آنها مرتب سازی بر هستید از در راه است که ارائه شده است.
اما واقعا آرایه فقط اشاره گر.
و به همین دلیل هنگامی که ما یک تغییر به آرایه،
هنگامی که ما یک آرایه به عنوان یک پارامتر به یک تابع و یا به عنوان یک استدلال
به یک تابع، محتویات آرایه در واقع در هر دو پذیرنده تغییر
و در تماس گیرنده.
که برای هر نوع دیگر از متغیر ما شاهد بود که چنین نیست.
به طوری که فقط چیزی برای نگه داشتن در این ذهن هنگامی که شما در حال کار با اشاره گرها،
این است که نام یک آرایه در واقع یک اشاره گر
به عنصر اول که آرایه.
>> OK بنابراین در حال حاضر ما همه این حقایق، اجازه دهید رفتن، درست است.
چرا ما در مورد مراقبت که در آن چیزی زندگی می کند.
خوب مثل من گفت، آن را بسیار بدانید که در آن زندگی می کند چیزی مفید
بنابراین شما می توانید به آنجا رفت و آن را تغییر دهید.
کار با آن و در واقع اند چیزی است که شما
می خواهم به انجام به آن اثر را متغیر، و اثر در برخی از کپی از آن را ندارد.
این است که به نام غیر مرجع.
ما به مرجع بروید و ما ارزش تغییر وجود دارد.
بنابراین اگر ما به یک اشاره گر و آن را به نام کامپیوتر، و آن را به یک شخصیت اشاره می کند،
پس می توان گفت * و * PC کامپیوتر است که نام و نام خانوادگی از آنچه که ما را پیدا کنید اگر ما به
به کامپیوتر آدرس.
یک شخصیت چه ما آنجا پیدا کردن است و * PC است که چگونه ما به داده ها در آن اشاره
محل.
بنابراین ما می تواند چیزی شبیه به می گویند * = D کامپیوتر و یا چیزی شبیه به آن،
و این بدان معناست که هر چه در حافظه آدرس کامپیوتر بود،
هر شخصیت قبلا وجود دارد، در حال حاضر D، اگر ما می گویند * PC = D.
>> بنابراین در اینجا ما دوباره با رفتن چیزهای عجیب و غریب C برخی، درست است.
بنابراین ما قبلا به عنوان دیده می شود * به نحوی بخشی از نوع داده ها،
و در حال حاضر آن را در حال استفاده در زمینه کمی متفاوت
برای دسترسی به داده در یک محل.
من می دانم که کمی گیج کننده و که در واقع بخشی از این طیف
مانند، چرا اشاره گرها این اساطیر در اطراف آنها به عنوان بسیار پیچیده،
نوع مشکل نحو است، صادقانه.
اما * در هر دو زمینه استفاده می شود، هر دو به عنوان بخشی از نام نوع،
و ما یک کمی را ببینید چیزی بعد دیگری، TOO.
و در حال حاضر است که اپراتور dereference.
پس از آن به مرجع می رود، دسترسی به داده های آن
در محل اشاره گر، و شما اجازه می دهد به آن را دستکاری خواهد شد.
>> در حال حاضر این است که بسیار شبیه به دیدن همسایه خود را، درست است.
اگر شما می دانید آنچه شما همسایه زندگی می کند، شما
حلق آویز نیست با همسایه خود را.
شما می دانید شما اتفاق می افتد می دانم که آنها زندگی می کنند،
اما این بدان معنا نیست که توسط موجب داشتن که دانش
شما در حال تعامل با آنها.
اگر می خواهید به تعامل با آنها، شما باید برای رفتن به خانه خود،
شما باید برای رفتن به جایی که آنها زندگی می کنند.
و هنگامی که شما انجام این کار، سپس شما می توانید ارتباط برقرار
با آنها را درست مثل شما می خواهید به.
و به همین ترتیب با متغیرها، شما نیاز به رفتن به آدرس خود
اگر شما می خواهید به آنها در تعامل است، شما نمی توانید فقط آدرس مطمئن شوید.
و راه شما به آدرس است برای استفاده *، اپراتور dereference.
شما چه فکر میکنید اتفاق می افتد اگر ما سعی و ارجاع
یک اشاره گر است که مقدار آن صفر است؟
به یاد بیاورید که تهی اشاره گر اشاره به هیچ چیز.
بنابراین اگر شما سعی می کنید و ارجاع هیچ چیز و یا رفتن به یک چیزی آدرس،
شما چه فکر میکنید اتفاقی می افتد؟
تقسیم بندی خوب اگر شما حدس زده گسل، شما می شود، مناسب است.
اگر شما سعی می کنید و ارجاع یک اشاره گر NULL،
شما یک تقسیم بندی رنج می برند گسل. اما صبر کنید،
آیا به تو بگویم، که اگر شما نمی خواهید
به مجموعه ای از ارزش خود را از خود اشاره گر به چیزی معنی دار،
شما باید مجموعه تهی؟
من و در واقع تقسیم بندی گسل نوع از رفتار خوب است.
>> آیا تا به حال یک متغیر اعلام کرد و ارزش خود را اختصاص داده است به سرعت؟
بنابراین شما فقط می گویند نوع int x؛ شما نمی در واقع آن را به هر چیزی اختصاص
و سپس بعد از آن در کد خود را، شما نسخه قابل چاپ کردن مقدار x،
داشتن هنوز هم نمی به هر چیزی اختصاص داده است.
اغلب شما می خواهید صفر است، اما گاهی اوقات شما
ممکن است برخی از عدد تصادفی را دریافت، و شما هیچ ایده که از کجا آمده.
به طور مشابه می توانید همه چیز اتفاق می افتد با اشاره گر.
هنگامی که شما یک اشاره گر اعلام نوع int * PK برای مثال،
و شما آن را به یک مقدار مشخص نمی کند، شما چهار بایت برای حافظه است.
هر چهار بایت از حافظه سیستم می تواند
پیدا است که برخی از ارزش معنی دار است.
و ممکن است وجود داشته اند چیزی در حال حاضر وجود دارد که
دیگر توسط دیگر مورد نیاز تابع، بنابراین شما فقط باید
هر چه اطلاعات وجود دارد.
>> اگر شما سعی در انجام ارجاع برخی از آدرس که شما نکن وجود دارد
در حال حاضر بایت و در وجود دارد، که در حال حاضر در اشاره گر خود را.
اگر شما سعی می کنید و ارجاع که اشاره گر، شما ممکن است با برخی از حافظه خراب
که شما قصد به یک ظرف غذا با آن است.
و در واقع شما می توانید انجام چیزی واقعا ویرانگر،
مانند شکستن یک برنامه دیگر، و یا شکستن یک تابع دیگر،
و یا انجام کاری مخرب است که شما قصد به انجام در همه.
و به طوری که به همین دلیل آن در واقع یک ایده خوب
به مجموعه ای از اشاره گر خود را به تهی اگر شما آنها را به چیزی معنی دار تنظیم نشده است.
این احتمالا در بهتر پایان روز برای برنامه های خود
پس از آن به سقوط آن را به انجام چیزی است که پیچ تا
برنامه دیگر و یا عملکرد دیگر است.
که رفتار است که احتمالا حتی کمتر از ایده آل توفنده.
و به طوری که به همین دلیل آن در واقع یک عادت خوب
برای دریافت به به مجموعه ای از اشاره گر خود را به تهی اگر شما آنها را تنظیم نشده
به ارزش معنی دار بلافاصله، یک مقدار که شما می دانید
و است که شما خیال راحت می توانید ارجاع.
>> بنابراین اجازه دهید اکنون آمده و نگاهی در نحو کلی از وضعیت.
اگر من می گویم نوع int * P ؛، چه من فقط انجام می شود؟
من چه کرده ام این است.
من می دانم که مقدار p به یک آدرس است چرا که همه اشاره گر فقط
آدرس ها.
من می توانم ارجاع P با استفاده از عملگر *.
در این زمینه در اینجا، در بسیار بالا به یاد * بخشی از نوع است.
نوع int * نوع داده است.
اما من ارجاع می P با استفاده از عملگر *،
و اگر من این کار را، اگر من به این آدرس بروید، چه خواهد شد که در آن آدرس را پیدا کنم؟
من یک عدد صحیح پیدا کنید.
بنابراین اعضای هیات * P است که اساسا گفت، ص یک آدرس است.
من می توانم ارجاع P و اگر من، من یک عدد صحیح را پیدا
در آن محل حافظه است.
>> OK بنابراین من گفت این بود دیگر وجود دارد چیزی که آزار دهنده با ستاره
و در اینجا آن است که چیزی که آزار دهنده با ستاره است.
آیا تا کنون سعی به اعلام متغیرهای متعدد از همان نوع
در همان خط از کد؟
بنابراین برای یک ثانیه، وانمود کند که خط، کد من در واقع در سبز وجود دارد
وجود ندارد و آن را فقط می گوید نوع int x، y و z ؛.
آنچه را که انجام است که در واقع ایجاد سه متغیرهای عدد صحیح را برای شما،
یکی از X نامیده می شود، یکی به نام y و Z به نام.
این یک راه برای انجام آن بدون. نیاز به تقسیم بر روی سه خط.
>> اینجا جایی است که ستاره دوباره آزار دهنده هر چند،
به این دلیل که در واقع بخشی * از هر دو نام و نوع بخش
از نام متغیر.
و بنابراین اگر من می گویند نوع int * پیکسل، PY، PZ، آنچه که من در واقع یک اشاره گر به یک عدد صحیح است
به نام پیکسل و دو عدد صحیح، PY و PZ.
و این احتمالا به که چه ما می خواهیم، ​​این خوب نیست.
>> بنابراین اگر من می خواهم برای ایجاد اشاره گر چند در همان خط، از همان نوع،
و ستاره، آنچه که من در واقع نیاز را به انجام * سرب، * PC است می گویند نوع int * PA،.
در حال حاضر داشتن فقط گفت که و در حال حاضر شما این گفتن،
شما احتمالا هرگز این کار را انجام خواهد داد.
و آن را احتمالا چیز خوبی صادقانه، زیرا شما ممکن است سهوا
حذف یک ستاره، چیزی شبیه به آن.
این احتمالا بهترین شاید اعلام اشاره گرها در خطوط فرد،
اما آن را فقط یک دیگر است از آن به نحو آزار دهنده
همه چیز با ستاره که اشاره گر بسیار دشوار برای کار با.
از آنجا که آن فقط این است نحوی ظروف سرباز یا مسافر شما باید به کار را از طریق.
با عمل آن را واقعا تبدیل به طبیعت دوم.
من هنوز هم اشتباهات را با آن هنوز هم پس از برنامه نویسی به مدت 10 سال،
به طوری که ناراحت نمی شود اگر چیزی اتفاق می افتد به شما، آن را بسیار رایج صادقانه.
این واقعا نوع یک نقص از نحو.
>> OK پس من از نوع وعده داده که ما دوباره
مفهوم چقدر بزرگ یک رشته است.
خب اگر من به شما گفت که یک رشته، ما واقعا نوع
شده است دروغ گفتن به شما تمام وقت.
هیچ نوع داده وجود دارد به نام رشته، و در واقع من
این در یکی از ذکر ما اولین فیلم ها در انواع داده ها،
که رشته یک نوع داده بود که برای شما در CS50.h. ایجاد شد
شما باید به # شامل CS50.H به منظور استفاده از آن.
>> خب رشته است که واقعا فقط یک نام مستعار برای چیزی
نام * کاراکتر، یک اشاره گر به یک شخصیت.
خب اشاره گر، به یاد بیاورید، فقط آدرس.
پس چه اندازه است در بایت یک رشته؟
به خوبی از آن چهار یا هشت است.
و به همین دلیل من می گویم چهار یا هشت دلیل است که آن را در واقع
بستگی به سیستم، اگر شما با استفاده IDE CS50، کاراکتر * به اندازه یک کاراکتر است
* هشت، یک سیستم 64 بیتی است.
هر آدرس در حافظه 64 بیت می باشد.
اگر شما با استفاده دستگاه CS50 و یا با استفاده از هر ماشین 32 بیتی،
و شما شنیده ام که مدت 32 بیتی ماشین آلات، چه ماشین 32 بیتی است؟
خوب آن را فقط به این معنی که هر آدرس در حافظه 32 بیت می باشد.
و به این ترتیب 32 بیت چهار بایت است.
بنابراین یک کاراکتر * چهار یا هشت است بسته به سیستم شما بایت.
و در واقع هر نوع داده ها، و یک اشاره گر به هر گونه اطلاعات
نوع، از همه اشاره گر فقط آدرس، چهار یا هشت بایت است.
بنابراین اجازه دهید این دوباره نمودار و اجازه دهید نتیجه گیری
این فیلم با کمی ورزش کنید.
بنابراین در اینجا ما با نمودار در سمت چپ است در همان ابتدا از ویدئو.
بنابراین آنچه در حال حاضر اتفاق می افتد اگر من می گویم * PK = 35؟
پس چه معنی است وقتی که من می گویند، * PK = 35؟
یک دوم.
* PK.
در زمینه در اینجا، * است اپراتور dereference.
بنابراین، هنگامی که ارجاع اپراتور استفاده می شود،
ما به آدرس اشاره به توسط PK، و ما تغییر چیزی است که ما پیدا کنید.
بنابراین * PK = 35 به طور موثر این کار را به تصویر.
بنابراین آن را اساسا از لحاظ دستوری یکسان به داشتن گفت K = 35.
>> یکی بیشتر.
اگر من می گویم INT متر، من ایجاد یک متغیر جدید به نام متر.
یک جعبه جدید، آن را یک جعبه سبز به دلیل آن را به برگزاری یک عدد صحیح،
و آن را با برچسب متر.
اگر من می گویم M = 4، من یک قرار عدد صحیح به آن جعبه.
اگر می گویند PK = & M، چگونه این تغییر نمودار؟
PK = & M، آیا شما به یاد چه و اپراتور می کند و یا نامیده می شود؟
به یاد داشته باشید که نام متغیر و برخی از آدرس از نام متغیر است.
بنابراین آنچه که ما در حال گفت است PK می شود آدرس متر.
و تا به طور موثر چه اتفاقی می افتد نمودار این است که PK نقاط دیگر
به k، اما امتیاز به متر.
>> دوباره اشاره گر بسیار روی حیله و تزویر به کار با
و آنها را به بسیاری از عمل، اما به دلیل
از توانایی خود برای شما اجازه می دهد به تصویب داده ها بین توابع
و در واقع کسانی که تغییرات در عمل،
گرفتن سر خود را در اطراف واقعا مهم است.
احتمالا پیچیده ترین موضوع بحث ما در CS50 مورد بحث،
اما ارزش شما که از استفاده از اشاره گر
بسیار بیشتر از عوارض که از یادگیری آنها آمده است.
بنابراین من برای شما آرزوی بهترین ها را از شانس یادگیری در مورد اشاره گر.
من داگ لوید هستم، این CS50.