[Powered by Google Translate] اجازه دهید بحث در مورد ساختمانها.
ساختمانها به ما ارائه یک راه به گروه با هم یک دسته از متغیرهای
به یک بسته خوب است.
این احتمالا ساده ترین راه برای دیدن یک مثال حق دور،
بنابراین ما می گویند ساختار،
سپس باز کردن بریس فرفری،
و در این ساختار، ما به سن نوع int داشته باشد،
* نام و نام کاراکتر،
و آن است.
این ممکن است به نظر می رسد عجیب و غریب با یک سمی کولن پس از یک بریس فرفری،
اما آن را در واقع لازم را با ساختمانها است.
هر نوع معتبر می تواند در تعریف ساختار بروید.
در اینجا، ما با استفاده از نوع int و * کاراکتر،
اما شما همچنین می تواند یک آرایه، استفاده از نظرات، 100 عنصر
یا حتی یکی دیگر از ساختارها (struct).
هنگامی که شما با استفاده از struct ها در C
شما در حال ایجاد انواع جدید
از مجموعه ای از انواع دیگر است.
در اینجا، ما در حال ساخت یک نوع جدید
از یک عدد صحیح و یک کاراکتر *.
همانطور که بعدا خواهید دید، یک نوع ساختار
در بسیاری از راه های معادل به هر نوع دیگر که شما استفاده می شود به.
معمولا من در مقایسه با یک نوع ساختار
شبیه به یک نوع عدد صحیح است.
در حالی که کد ما نوشت C معتبر است،
آن را بسیار مفید نیست،
و صدای جرنگ جرنگ به ما هشدار می دهد.
به یاد داشته باشید که چگونه ساختمانها و آن را مشابه هستند؟
خب، ما اساسا فقط گفت:
هوشمند،
که یک خط بسیار مفید است.
پس در واقع اعلام یک متغیر از این نوع به شما اجازه می دهد تا
به آن نام قبل از نقطه و ویرگول.
ما می خواهیم دانش آموز متغیر تماس بگیرید.
حالا ما اعلام کرد یک دانشجوی متغیر نامیده می شود
با توجه به نوع داده شده توسط ساختار.
چگونه به متغیرهای درون ساختار؟
با مشخصات فنی، اسامی این متغیرها
اعضا هستند.
برای دسترسی به هر عضو ویژه در ساختار دانشجویی،
شما با اضافه کردن نقطه به نام متغیر،
به دنبال نام عضو که شما می خواهید.
بنابراین در اینجا، تنها 2 معتبر احتمالات
هستند student.age
و student.name.
و ما می توانیم چیزی شبیه به
student.age = 12
و student.name = دانشجو.
حالا چه می شود اگر ما می خواستیم به یک دانش آموز دوم؟
شما ممکن است فکر می کنم برای کپی کردن و چسباندن این خطوط
و دانش آموز را به دانش آموزان 2 یا چیزی،
و آن کار خواهد کرد،
اما از نظر فنی، دانشجو و دانش آموز 2
از همان نوع را ندارد.
ببینید، شما قادر نخواهد بود به آنها اختصاص دهید و به کس دیگری.
دلیل این است که، تا کنون،
ساختار خود بوده است ناشناس است.
ما نیاز به یک نام می دهد.
برای انجام این کار، به نام ساختار ما وارد
پس از ساختار کلمه.
دانش آموزان،
به دنبال تعریف شده است.
ما هنوز هم می تواند بلافاصله پس از اعلام یک متغیر از نوع
ساختار دانش آموز، مانند قبل از.
ما می خواهیم آن را S1
با دادن ساختار نام،
ما در حال حاضر می تواند دانش آموزان ساختار استفاده کنید
تقریبا در راه همان استفاده از int است.
بنابراین ما می توانیم یک متغیر از نوع ساختار دانش آموز اعلام،
مانند
ساختار دانش آموز S2.
مانند آرایه ها، ساختمانها ارائه دهی اولیه میانبر نحو،
بنابراین می توان گفت، ساختار دانش آموز S2
برابر با
چپ فرفری بریس 3، S2.
در اینجا، S2.age خواهد بود 3.
و S2.name اشاره به S2.
فکر می کنم از همه چیز شما می توانید انجام دهید با یک نوع int
و بسیاری از آنها را به شما می توانید با یک نوع ساختار دانش آموز انجام دهد.
ما می توانیم یک دانشجوی ساختار را به عنوان نوع پارامتر یک تابع استفاده کنید.
ما می توانیم دانشجویی ساختار را در داخل یک ساختار جدید استفاده کنید.
ما می توانیم یک اشاره گر به ساختار دانش آموز داشته باشد.
ما می توانیم اندازه از دانش آموزان ساختار را انجام دهد.
دانشجوی ساختار یک نوع است
درست مثل نوع int یک نوع است.
ما همچنین می توانیم S1 به S2 اختصاص
چرا که هر دو از همان نوع هستند، بنابراین ما می توانیم انجام دهیم
S1 = S2.
چه اتفاقی می افتد اگر ما
S1.age = 10؟
تغییر S2 در همه؟
باز هم، از ساختمانها به عنوان عدد صحیح به طور منظم فکر می کنم.
اگر ما اختصاص X از نوع int به برخی از Y اعضای هیات،
مانند X = Y
و سپس X را تغییر دهید،
همانطور که در X + +،
Y تغییر در همه؟
Y تغییر در اینجا، و نه کند S2 بالا.
S2.age هنوز هم 3.
اما توجه داشته باشید که زمانی که یک ساختار خود را به دیگری اختصاص،
همه از اشاره گر هنوز هم به همان چیزی که اشاره،
از آنجایی که آنها فقط کپی شد.
اگر شما نمی خواهید اشاره گر را به اشتراک گذاشته شود،
شما باید به صورت دستی از عهده آن،
شاید با malicking یک بلوک از حافظه برای یکی از اشاره گر به اشاره
و کپی کردن داده ها در طول.
این ممکن است آزار دهنده به ساختار دانش آموز به نوشتن در همه جا.
با استفاده از نوع دف، ما می توانیم انجام دهیم
نوع دف
ساختار
و ما آن را دانش آموز.
در حال حاضر، ما می توانیم دانش آموزان را در همه جا استفاده
که ما استفاده می شود به استفاده از ساختار دانش آموز است.
این نوع دف ساختار ناشناس
و آن را به دانش آموز می نامد.
اما اگر ما نیز شناسه دانشجویی نگه دارید
در کنار ساختار کلمه، به عنوان دانش آموزان ساختار typedef،
ما می توانیم هر دو ساختار دانش آموز و دانشجو به جای یکدیگر در حال حاضر استفاده از.
آنها حتی نمی باید به همین نام است.
ما می تواند دانش آموز دف ساختار به باب تایپ
و پس از آن دانش آموزان و باب ساختار
نوع قابل تعویض خواهد بود.
صرف نظر از نوع دف،
ما نیاز به شناسه بعدی به ساختار
اگر تعریف از ساختار
است بازگشتی.
برای مثال،
نوع دف در ساختار گره
و آن را به عنوان وال نوع int تعریف شده
و آن را به یک اشاره گر است که اشاره به گره ساختار دیگری داشته باشد.
عنوان در ساختار گره * بعدی است.
و پس از آن خواهیم آن را گره.
این ساختار است که به بازگشتی،
از تعریف ساختار گره شامل درون آن
یک اشاره گر به گره ساختار.
توجه کنید که ما باید بگوییم در ساختار گره * بعدی
در داخل از تعریف ساختار گره،
از نوع دف هنوز تمام نشده است اجازه می دهد تا به ساده
فقط * گره بعدی.
شما بیشتر در مورد ساختمانها شبیه به این
هنگامی که با لیست های پیوندی و درختان.
در مورد ساختمانها در یک تابع چه؟
این نیز کاملا معتبر است.
ما می توانیم
از درجه اعتبار ساقط تابع
طول می کشد که به عنوان آرگومان،
دانشجو ها
و کاری که با دانش آموز است.
و پس از آن ما می توانید آن را به عنوان ساختار دانش آموز رو منتقل می شود.
تابع S1 از قبل است.
ساختار رفتار
دقیقا به عنوان یک عدد صحیح را زمانی که به یک تابع منتقل می شود.
تابع دریافت یک کپی از S1
و به همین ترتیب می توانید تغییر دهید S1؛
در عوض، تنها نسخه ای از آن را که در S. ذخیره شده
اگر شما می خواهید این تابع به قادر به تغییر S1،
تابع نیاز را به دانش آموز * S،
و شما باید به تصویب S1 آدرس، مانند.
دانشجو * S، S1 و تابع.
یکی دیگر از دلایل به تصویب از طریق آدرس در اینجا وجود دارد.
چه می شود اگر ساختار ما شامل 100 زمینه؟
هر بار که ما عبور یک دانش آموز به تابع،
برنامه ما نیاز به کپی از آن 100 حوزه به S تابع استدلال،
حتی اگر آن را به اکثریت قریب به اتفاق از آنها استفاده نکرده است.
بنابراین حتی اگر عملکرد اصلاح دانش آموز برنامه ریزی نیست،
اگر هنوز هم می تواند با ارزش را به آدرس تصویب می شود.
خوب، چه می شود اگر ما می خواهیم به ایجاد یک اشاره گر به ساختار؟
ما می تواند چیزی شبیه به انجام
دانشجوی * S
برابر malloc
اندازه از دانش آموزان است.
توجه داشته باشید که اندازه هنوز هم کار می کند در اینجا.
پس چگونه ما در حال حاضر عضو سنی دسترسی داشته باشید
بلوک است که نقاط S به؟
شما ممکن است به فکر می کنم
* S.age = 4،
اما این کاملا کار نمی کرد.
از آنجا که این واقعا به عنوان تفسیر شود
* S.age در پرانتز = 4،
که حتی نمی خواهد کامپایل،
از S است که ساختار و یا به جای یک اشاره گر به ساختار نیست،
و به همین ترتیب نقطه به کار خواهد کرد.
ما می توانیم انجام دهیم
(S) سن = 4
اما از پرانتز می تواند آزار دهنده و گیج کننده است.
خوشبختانه، ما باید یک عملگر ویژه فلش
به نظر می رسد که چیزی شبیه به
S-> سن = 4.
این 2 راه ارجاع سن
معادل هستند
و ما واقعا تا به حال فلش اپراتور نیاز دارند،
اما آن را می سازد همه چیز نگاه بهتر است.
از آنجا که S یک اشاره گر به برخی از بلوک از حافظه که حاوی ساختار،
شما می توانید از سن S> فکر می کنم به عنوان پیروی از فلش اشاره گر
و گرفتن عضو سنی.
پس چرا ما باید همیشه ساختمانها استفاده می کنید؟
این قطعا ممکن است به دور تنها با اعداد صحیح اولیه،
کاراکتر ها، اشاره گر ها و مانند آن
که ما در حال استفاده است؛
به جای S1 و S2 قبل از،
ما می تواند داشته اند age1، age2، NAME1 و NAME2
همه در متغیرهای جداگانه.
این خوب است با تنها 2 دانش آموزان،
اما اگر ما تا به حال 10 نفر از آنها؟
و چه می شود اگر به جای آن از تنها 2 زمینه،
ساختار دانش آموز به حال 100 زمینه؟
GPA، دوره ها، رنگ مو، جنس، و غیره.
در عوض فقط 10 ساختمانها، ما نیاز به 1،000 متغیرهای جداگانه است.
همچنین، در نظر گرفتن یک تابع
است که طول می کشد که ساختار با 100 رشته با استدلال تنها
و چاپ از تمام زمینه ها است.
اگر ما یک ساختار استفاده نمی کند،
هر بار که تابع را ما تماس بگیرید،
ما نیاز داریم تا در همه 100 متغیر منتقل می کند،
و اگر ما 100 متغیر برای دانشجو 1،
و 100 متغیر برای دانشجو 2،
ما نیاز داریم تا مطمئن شوید که ما به طور تصادفی تصویب برخی از متغیرهای دانشجویی 1
و برخی از متغیرها از دانشجو 2.
این غیر ممکن است به آن اشتباه را با یک ساختار،
از آنجا که همه 100 متغیر را در یک بسته واحد موجود.
فقط یک زن و شوهر از یادداشت های نهایی:
اگر شما درک همه چیز را تا به این نقطه، بزرگ شده است.
بقیه این ویدئو فقط به خاطر کامل '.
از آنجا که ساختمانها می تواند هر نوع اشاره گر نگه دارید،
آنها همچنین می توانند اشاره گر تابع نگه دارد.
اگر شما آشنایی با برنامه نویسی شی گرا،
این فراهم می کند راه را برای استفاده از ساختمانها به برنامه در سبک شی گرا است.
بیشتر در مورد اشاره گر تابع را در زمان دیگری.
همچنین، گاهی اوقات شما ممکن است 2 ساختمانها داشته باشند
تعاریف که بر روی یک دیگر بستگی دارد.
برای مثال،
ما می تواند در ساختار داشته باشد،
است که به عنوان تعریف شده
یک اشاره گر به ساختار B،
ساختار B * X،
و در حال حاضر ما می توانیم B ساختار
است که به عنوان یک اشاره گر تعریف شده
به ساختار،
ساختار A * Y.
اما این نمی خواهد کامپایل،
از B ساختار در زمانی که ساختار است که وارد شده وجود ندارد.
و اگر ما مبادله ساختار و ساختار B،
پس ما فقط می خواهم با همین مشکل به سمت چپ؛
در این زمان، با ساختار موجود نیست.
برای حل این مشکل، ما می توانیم بنویسیم
ساختار B؛
قبل از تعریف ساختار A.
این است که به نام یک اعلان رو به جلو است.
این فقط به شما اجازه می دهد کامپایلر می دانیم که
ساختار B یک نوع معتبر است که به طور کامل تعریف شده بعد یا هر جای دیگر است.
نام من راب Bowden، و این CS50.
[CS50.TV]