[Powered by Google Translate] Nin structs haqqında danışmaq edək.
Structs birlikdə dəyişənlərin bir dəstə gruplandırmak üçün bir yol bizə təqdim
bir gözəl paket daxil.
O, dərhal bir örnek görmek üçün yəqin ki, asan deyil
belə ki, biz struct demək
sonra, buruq brace açılması
və bu struct, biz, bir int yaş olacaq
bir char * adı,
və bu.
O, buruq brace sonra nöqtəli vergül ilə qəribə görünə bilər
lakin bu structs zəruri fakt var.
Hər hansı bir etibarlı növü struct definition ərzində davam edə bilər.
Burada, bir int və char * istifadə etdiyiniz
lakin siz də, demək ki, 100 elementlərin bir sıra istifadə edə bilər
və ya hətta başqa struct.
Siz C structs istifadə etdiyiniz zaman,
yeni növ oluşturuyorsanız
digər növ toplusu həyata.
Burada biz yeni bir növü edirik
bir tam və char * həyata.
Biz sonra görəcəksiniz kimi, struct növü
alıştığınız hər hansı digər növü ekvivalent yolları bir çox var.
Adətən, mən necə bir struct növü müqayisə olacaq
bir tam növü kimi.
Biz yazdı kodu etibarlı C, baxmayaraq
Bu, çox faydalı deyil
və cingilti bizə bir xəbərdarlıq verəcək.
Structs və oxşar necə saxla?
Yaxşı, biz əsasən yalnız bildirib
int,
bir çox faydalı xətt deyil.
Belə nin həqiqətən bu cür bir dəyişən elan edək
bu nöqtəli vergül əvvəl bir ad verərək.
Biz dəyişən tələbə zəng edəcəyik.
İndi biz bir dəyişən adlandırılan tələbə elan etdik
bu struct verdiyi növü.
Necə biz struct daxilində dəyişənlərin əldə edirsiniz?
Bu dəyişənlər üçün texniki, adları
üzvləridir.
Bir tələbə struct hər hansı xüsusi üzv olmaq üçün,
Siz dəyişən adı bir dot əlavə
istədiyiniz üzv adı ilə izlədi.
Belə ki, burada yalnız 2 etibarlı imkanlar
student.age var
və student.name.
Və biz bir şey kimi edə bilərsiniz
student.age = 12
və student.name = tələbəsi.
İndi biz ikinci bir tələbə etmək istəyirdi, əgər?
Siz bu sətirləri seçin və yapışdırıb hesab bilər
və tələbə 2 və ya bir şey üçün tələbə dəyişdirmək,
və işləyəcək,
lakin texniki, tələbə və şagird 2
eyni tipli yoxdur.
Bax, siz bir-birinə onları təyin edə bilməz.
Bu, çünki, belə ki, uzaq
Sizin struct anonim olmuşdur.
Biz bu adı vermək lazımdır.
Bunu etmək üçün, biz struct adı daxil edin
sözü struct sonra.
tələbə,
müəyyən izlədi.
Biz hələ dərhal tipli dəyişən elan edə bilər
biz əvvəl olduğu kimi, tələbə struct.
Biz S1 arayacaðým
Bu struct adı verməklə,
biz struct tələbə istifadə edə bilərsiniz
demək olar ki, tam olaraq eyni şəkildə biz int istifadə edir.
Belə ki, biz, növü struct tələbə bir dəyişən elan edə bilər
kimi
struct tələbə S2.
Seriallardakı kimi, structs, qısa başlatma sintaksis təmin
biz tələbə S2 struct, demək olar
bərabərdir
sol buruq brace 3, S2.
Burada S2.age, 3 olacaq
və S2.name S2 qeyd edəcək.
Bir int tipli edə bilərsiniz bütün şeylər düşünün
və onların əksəriyyəti bir struct tələbə növü ilə edə bilərsiniz.
Biz bir funksiya parametr bir növü kimi struct tələbə istifadə edə bilərsiniz.
Biz yeni struct daxilində struct tələbə istifadə edə bilərsiniz.
Biz struct tələbə bir göstərici ola bilər.
Biz struct tələbə ölçüsü edə bilərsiniz.
Struct tələbə bir növü
yalnız int kimi bir növüdür.
Biz də S2 üçün S1 təyin edə bilər
eyni tipli, çünki, belə ki, biz edə
S1 = S2.
Biz ne olur
S1.age = 10?
Bütün S2 dəyişiklik varmı?
Yenə yalnız müntəzəm integers kimi structs düşünürəm.
Bəzi int Y bəzi int X təyin etsəniz,
X = Y kimi
və sonra, X dəyişmək
kimi X + +,
Y bütün dəyişdirmək deyil?
Y burada dəyişdirmək, və nə yuxarıda S2 nə deyil.
S2.age hələ 3.
Lakin qeyd bir struct təyin zaman ki,
bu göstəricilər bütün hələ də eyni şey qeyd
yalnız sitemizi yana.
Siz göstəricilərinə ortaq olmaq istəmirsinizsə,
siz özünüz ki, idarə etmək lazımdır
bəlkə göstəricilərinə biri üçün yaddaş bir blok malicking ilə qeyd etmək
və məlumat artıq çıxarmaq.
Bu hər yerdə struct tələbə yazmaq üçün annoying ola bilər.
Bir növü def istifadə edərək, biz edə
növü def
struct
və biz bu tələbə zəng edəcəyik.
İndi hər yerdə tələbə istifadə edə bilərsiniz
biz struct tələbə istifadə üçün istifadə edir.
Bu def anonim struct var
və tələbə çağırır.
Amma biz də tələbə identifikator saxlamaq əgər
sözü struct yanında typedef struct tələbə kimi,
biz əvəz indi struct tələbə və tələbə də istifadə edə bilər.
Onlar hətta eyni adı yoxdur.
Biz Bob üçün def struct tələbə yazın bilər
və sonra tələbə və Bob struct
əvəz növləri olacaq.
Asılı olmayaraq növü def ki,
biz struct yanındakı identifikator lazımdır
əgər struct müəyyən
recursive edir.
Məsələn,
növü def struct node
və bir int val kimi müəyyən olunacaq
və başqa struct node göstərir ki, bir göstərici olacaq.
* Növbəti struct node kimi.
Və sonra biz bu node zəng edəcəyik.
Bu struct, recursive edir
struct node müəyyən içinde içerdiğinden
bir struct node bir göstərici.
Biz struct node * Növbəti demək edək ki,
bu struct node müəyyən daxilində,
növü def imkan hələ bitmiş deyil bəri bizə bu sadələşdirmək
yalnız node * yanında.
Bu oxşar structs haqqında daha ətraflı məlumat lazımdır
zaman bağlı siyahıları və ağac ilə məşğul.
Bir funksiyası structs haqqında nə?
Bu da mükəmməl etibarlıdır.
Biz ola bilər
FUNC ləğv
ki, bir arqument kimi görür
tələbə s
və tələbə ilə bir şey yoxdur.
Və sonra biz kimi tələbə struct kimi keçə bilər.
Əvvəl S1 FUNC.
Bu struct davranır
bir tam funksiyası keçmiş zaman tam olaraq.
FUNC S1 surətini qəbul
və belə S1 dəyişdirə bilməz;
deyil, S. bunun yalnız surəti saxlanılır ki,
Əgər funksiyası S1 dəyişdirmək edə üçün
FUNC, tələbə * S etmək lazımdır
və bunu kimi, ünvanı S1 keçmək lazımdır.
Tələbə * S, FUNC & S1.
Burada ünvan keçmək başqa səbəb var.
Bizim struct 100 sahələri olan nə varsa?
Biz FUNC bir tələbə keçmək hər bir vaxt,
proqram, FUNC arqumenti S o 100 sahələrdə bütün surəti lazımdır
hətta əgər onların əksəriyyəti istifadə heç vaxt.
FUNC tələbə değiştirmeyle haqqında niyyətində deyil Belə ki, hətta,
hələ ünvan keçmək qiymətli ola bilər.
OK, biz struct bir pointer yaratmaq istəyirsinizsə, nə?
Biz bir şey edə
tələbə * S
malloc bərabərdir
tələbə ölçüsü.
Hələ burada işləyir ki, ölçüsü edək.
Belə ki, necə biz indi yaş üzv olmaq yoxdur
blokunun S bal ki?
Siz ilk nə düşünə bilər
* S.age = 4,
lakin bu olduqca işləməyəcək.
Bu, həqiqətən kimi təfsir edilə çünki
Parantez = 4 * S.age,
hətta tərtib edəcək
S struct üçün struct və ya daha çox bir göstərici deyil, çünki
və belə dot burada işləməyəcək.
Biz edə
(* S). Yaşı = 4
lakin parantez annoying və confusing əldə edə bilərsiniz.
Şükür ki, biz xüsusi arrow operator var
bir şey kimi görünür
S-> yaş = 4.
Yaş sened Bu 2 yol
ekvivalent
və biz, həqiqətən, heç arrow operator ehtiyac yoxdur
lakin bu şeyi gözəl baxmaq edir.
S struct olan yaddaş bəzi blok bir pointer olduğundan,
İmleci arrow baxın kimi S> yaş hesab edə bilər
və yaş üzv grab.
Belə ki, niyə biz heç structs istifadə etməli?
Bu, yalnız ibtidai integers ilə üz almaq üçün mütləq mümkün
Sandıqı, göstəricilər və bu kimi
biz istifadə edirik ki;
əvəzinə S1 və S2 əvvəl,
biz age1, age2, name1 və name2 var bilər
ayrı-ayrı dəyişənlərin bütün.
Bu, yalnız 2 tələbələri ilə gözəl
lakin biz onlardan 10 olsaydı?
Və nə əgər əvəzinə yalnız 2 sahələri,
tələbə struct 100 sahələri var idi?
GPA, kurslar, saç rəngi, cinsi, və s.
Bunun əvəzinə yalnız 10 structs, biz 1000 ayrıca dəyişənlərin lazımdır.
Həmçinin, bir funksiyası hesab
ki, yalnız mübahisə ilə 100 sahələri ilə struct edir
və bütün sahələrdə çap edir.
Biz struct istifadə etmədikdə,
biz ki, funksiyası zəng hər zaman
biz bütün 100 dəyişənlərin da keçmək lazımdır
və biz tələbə üçün 1 100 dəyişənlər varsa,
və 100 tələbə 2 dəyişənlər,
biz təsadüfən tələbə 1-dən bəzi dəyişənlər keçmək yoxdur əmin olmalıdır
və tələbə 2 bəzi dəyişənlərin.
O, struct ilə səhv etmək mümkün deyil
100 dəyişənlərin vahid paket yer çünki.
Yekun qeydləri bir neçə:
Bu baxımdan hər şeyi qədər böyük başa varsa.
Video qalan yalnız tamlığı 'naminə edir.
Structs göstərici istənilən aça bilər, çünki
onlar da funksiyası göstəricilərinə aça bilər.
Əgər obyekt yönümlü proqramlaşdırma ilə tanış edirsinizsə,
bu bir obyekt yönümlü stil proqram structs istifadə etmək üçün bir yol təqdim edir.
Başqa bir zaman funksiyası göstəricilər haqqında daha çox.
Həmçinin, bəzən 2 structs ola bilər
onun anlayışlar bir-birinə asılıdır.
Məsələn,
biz struct A bilər
olan kimi müəyyən edilir
bir struct B bir göstərici,
struct B * X,
və indi biz struct B ola bilər
bir göstərici kimi müəyyən edilir
bir struct A üçün
struct A * Y.
Amma bu, tərtib edəcək
struct B struct A tərtib olunan zaman mövcud deyil bəri.
Və biz struct A və struct dəyişdirmək əgər B,
sonra biz yalnız eyni problem ilə tərk olarıq;
Bu vaxt, A mövcud deyil struct.
Bu həll etmək üçün biz yaza bilərsiniz
struct B;
struct A. anlayışına əvvəl
Bu irəli bəyannamə adlanır.
Bu yalnız compiler bilmək imkan verir ki,
struct B tam sonra və ya başqa bir yerdə müəyyən bir etibarlı növüdür.
My name Rob Bowden, bu CS50 edir.
[CS50.TV]