1 00:00:07,260 --> 00:00:09,180 [Powered by Google Translate] Ајде да зборуваме за structs. 2 00:00:09,180 --> 00:00:12,130 Structs ни овозможи со еден начин да ги групирате еден куп на променливи заедно 3 00:00:12,130 --> 00:00:14,350 во еден убав пакет. 4 00:00:14,350 --> 00:00:17,020 Тоа е веројатно најлесниот да видите пример веднаш, 5 00:00:17,020 --> 00:00:20,030 па велиме struct, 6 00:00:20,030 --> 00:00:23,340 потоа отворање кадрава голема заграда, 7 00:00:23,340 --> 00:00:26,630 и во овој struct, ќе имаат int возраст, 8 00:00:28,920 --> 00:00:31,350 на char * име, 9 00:00:31,350 --> 00:00:34,670 и тоа е тоа. 10 00:00:37,350 --> 00:00:40,650 Тоа може да изгледа чудно со точка-запирка после подготвуваат кадрава, 11 00:00:40,650 --> 00:00:43,620 но тоа е всушност потребно со structs. 12 00:00:43,620 --> 00:00:46,270 Некој валиден тип може да оди во структурата дефиниција. 13 00:00:46,270 --> 00:00:49,530 Еве, ние сме користеле int и char *, 14 00:00:49,530 --> 00:00:52,610 но вие исто така може да се користи низа, на да речеме, 100 елементи 15 00:00:52,610 --> 00:00:54,910 или дури и друга struct. 16 00:00:54,910 --> 00:00:56,960 Кога сте со користење structs во C, 17 00:00:56,960 --> 00:00:58,430 сте создавање нови видови 18 00:00:58,430 --> 00:01:00,860 од колекцијата на другите видови. 19 00:01:00,860 --> 00:01:02,620 Тука, ние се прави нов тип 20 00:01:02,620 --> 00:01:05,060 од цел број и char *. 21 00:01:05,060 --> 00:01:07,400 Како што ќе видиме подоцна, struct тип 22 00:01:07,400 --> 00:01:10,700 е во многу начини еквивалентно на било кој друг вид сте навикнати. 23 00:01:10,700 --> 00:01:13,310 Обично, ќе се споредуваат како struct тип 24 00:01:13,310 --> 00:01:15,790 Слична е цел број тип. 25 00:01:15,790 --> 00:01:18,520 Додека го кодот ние напиша важи Ц, 26 00:01:18,520 --> 00:01:20,320 тоа не е многу корисно, 27 00:01:20,320 --> 00:01:22,340 и ѕвекот ќе ни даде предупредување. 28 00:01:22,340 --> 00:01:24,970 Се сеќавам како structs и се слични? 29 00:01:24,970 --> 00:01:26,710 Па, ние во основа, само рече 30 00:01:27,840 --> 00:01:30,060 int, 31 00:01:30,060 --> 00:01:33,140 што не е многу корисна линија. 32 00:01:33,140 --> 00:01:35,760 Па ајде всушност декларирате променлива од тој вид 33 00:01:35,760 --> 00:01:38,760 од страна давајќи му име пред запирка. 34 00:01:42,170 --> 00:01:45,000 Ние ќе се јавите на променлива студент. 35 00:01:48,190 --> 00:01:51,350 Сега сме прогласи променлива наречена студент 36 00:01:51,350 --> 00:01:53,980 со типот дадена од страна на struct. 37 00:01:53,980 --> 00:01:56,730 Како да ја добиете на променливи внатре во структурата? 38 00:01:56,730 --> 00:01:59,040 Технички, имиња за овие променливи 39 00:01:59,040 --> 00:02:01,070 се членови. 40 00:02:01,070 --> 00:02:04,000 Да пристапите на некој особено член во студентски struct, 41 00:02:04,000 --> 00:02:06,440 ќе додадете точка на името на променливата, 42 00:02:06,440 --> 00:02:08,860 проследено со името на земјите сакате. 43 00:02:08,860 --> 00:02:11,690 Значи тука, само 2 валидна можности 44 00:02:11,690 --> 00:02:17,760 се student.age 45 00:02:17,760 --> 00:02:24,460 и student.name. 46 00:02:24,460 --> 00:02:26,820 И можеме да направиме нешто како 47 00:02:26,820 --> 00:02:30,320 student.age = 12 48 00:02:30,320 --> 00:02:39,310 и student.name = студент. 49 00:02:39,310 --> 00:02:42,580 Сега што ако сакаме да се направи втор студент? 50 00:02:42,580 --> 00:02:44,760 Можеби мислите да копирате и залепите овие линии 51 00:02:44,760 --> 00:02:48,110 и промена студент до студент 2 или нешто, 52 00:02:48,110 --> 00:02:50,090 и дека ќе работи, 53 00:02:50,090 --> 00:02:52,670 но технички, ученик и студент 2 54 00:02:52,670 --> 00:02:54,540 немаат ист тип. 55 00:02:54,540 --> 00:02:56,940 Види, нема да бидете во можност да им доделите еден на друг. 56 00:02:56,940 --> 00:02:58,560 Тоа е затоа што, досега, 57 00:02:58,560 --> 00:03:00,950 вашиот структурата е анонимен. 58 00:03:00,950 --> 00:03:02,290 Ние треба да го даде името. 59 00:03:02,290 --> 00:03:04,420 За да го направите тоа, ние внесете го името на struct 60 00:03:04,420 --> 00:03:06,950 по зборот struct. 61 00:03:09,440 --> 00:03:11,170 студент, 62 00:03:11,170 --> 00:03:14,680 проследено со дефиницијата. 63 00:03:16,500 --> 00:03:18,940 Ние се уште може веднаш да декларирате променлива од тип 64 00:03:18,940 --> 00:03:21,570 struct студент, како што беше порано. 65 00:03:24,320 --> 00:03:28,360 Ние ќе го наречеме S1 66 00:03:28,590 --> 00:03:30,760 Со давање на struct име, 67 00:03:30,760 --> 00:03:33,050 ние сега може да користи struct студент 68 00:03:33,050 --> 00:03:36,950 во скоро исти начин би го користите int. 69 00:03:36,950 --> 00:03:39,580 Значи можеме да декларирате променлива од тип struct студент, 70 00:03:39,580 --> 00:03:42,360 како 71 00:03:42,360 --> 00:03:49,500 struct студент S2. 72 00:03:51,020 --> 00:03:55,130 Како низи, structs обезбеди кратенка иницијализација синтакса, 73 00:03:55,130 --> 00:03:58,670 па може да се каже, struct студент S2 74 00:03:58,670 --> 00:04:01,420 еднакво 75 00:04:01,420 --> 00:04:06,040 левата кадрава голема заграда 3, S2. 76 00:04:09,210 --> 00:04:12,600 Еве, S2.age ќе биде 3, 77 00:04:12,600 --> 00:04:15,910 и S2.name ќе точка за S2. 78 00:04:15,910 --> 00:04:19,149 Помислете на сите работи што можете да направите со int тип 79 00:04:19,149 --> 00:04:22,460 и повеќето од нив може да се направи со struct студент тип. 80 00:04:22,460 --> 00:04:26,060 Може да се користат struct студент, како еден вид на функција параметар. 81 00:04:26,060 --> 00:04:28,790 Можеме да го користиме struct студент во внатрешноста на новиот struct. 82 00:04:28,790 --> 00:04:31,010 Ние може да има покажувач на struct студент. 83 00:04:31,010 --> 00:04:33,540 Ние можеме да правиме големината на struct студент. 84 00:04:33,540 --> 00:04:35,510 Struct студент е еден вид 85 00:04:35,510 --> 00:04:38,030 исто како int е тип. 86 00:04:38,030 --> 00:04:40,540 Ние, исто така може да додели S1 да S2 87 00:04:40,540 --> 00:04:43,760 бидејќи и двете се од ист тип, така што можеме да направиме 88 00:04:44,390 --> 00:04:47,540 S1 = S2. 89 00:04:47,540 --> 00:04:50,430 Што се случува ако правиме 90 00:04:50,430 --> 00:04:55,300 S1.age = 10? 91 00:04:56,340 --> 00:04:58,880 Дали S2 промена на сите? 92 00:04:58,880 --> 00:05:02,800 Повторно, мислам на structs само како редовни броеви. 93 00:05:02,800 --> 00:05:05,590 Ако ние доделите некој int x некои int y, 94 00:05:05,590 --> 00:05:08,970 како X = Y 95 00:05:08,970 --> 00:05:10,850 и потоа да се промени X, 96 00:05:10,850 --> 00:05:14,230 во X + +, 97 00:05:14,230 --> 00:05:17,020 не Y промена на сите? 98 00:05:17,020 --> 00:05:20,980 Y не се менува тука, па ниту пак S2 погоре. 99 00:05:20,980 --> 00:05:24,120 S2.age се уште е 3. 100 00:05:24,120 --> 00:05:27,350 Но, имајте во предвид дека при доделување на една struct на друг, 101 00:05:27,350 --> 00:05:30,300 сите покажувачи уште укажуваат на истото, 102 00:05:30,300 --> 00:05:32,260 бидејќи тие беа само копирани. 103 00:05:32,260 --> 00:05:34,300 Ако не сакате совети како да се дели, 104 00:05:34,300 --> 00:05:36,100 ќе треба рачно да се справи со тоа, 105 00:05:36,100 --> 00:05:39,780 можеби со malicking еден блок од меморија за еден од совети како да се укаже на 106 00:05:39,780 --> 00:05:42,120 и копирање на податоци преку. 107 00:05:42,120 --> 00:05:45,540 Тоа може да биде досадно да мора да пишува struct студент насекаде. 108 00:05:45,540 --> 00:05:48,730 Помош на еден вид дефиниција, можеме да направиме 109 00:05:51,630 --> 00:05:55,850 тип дефиниција 110 00:05:55,850 --> 00:05:58,830 struct 111 00:05:58,830 --> 00:06:01,270 и ние ќе го наречеме студент. 112 00:06:05,620 --> 00:06:08,360 Сега, можеме да го користиме студент секаде 113 00:06:08,360 --> 00:06:11,090 дека ние се користи за употреба struct студент. 114 00:06:11,090 --> 00:06:13,410 Овој тип дефиниција е анонимен struct 115 00:06:13,410 --> 00:06:15,750 и тоа го нарекува студент. 116 00:06:15,750 --> 00:06:18,220 Но ако ние, исто така, имајте на студентот идентификатор 117 00:06:18,220 --> 00:06:22,380 до збор struct, како и во typedef struct студент, 118 00:06:27,670 --> 00:06:31,590 можеме да го користите двете struct ученик и студент мешаат сега. 119 00:06:31,590 --> 00:06:34,060 Тие дури и не мора да имаат исто име. 120 00:06:34,060 --> 00:06:36,710 Ние би можеле да напишеш дефиниција struct студент на Боб 121 00:06:36,710 --> 00:06:38,950 а потоа struct студент и Боб 122 00:06:38,950 --> 00:06:41,270 ќе биде заменлив типови. 123 00:06:41,270 --> 00:06:44,050 Без оглед на видот дефиниција, 124 00:06:44,050 --> 00:06:46,750 ние треба идентификатор до struct 125 00:06:46,750 --> 00:06:48,250 ако дефиницијата на struct 126 00:06:48,250 --> 00:06:50,450 е рекурзивен. 127 00:06:50,450 --> 00:06:52,620 На пример, 128 00:06:52,620 --> 00:06:56,140 тип дефиниција struct јазол 129 00:06:56,140 --> 00:07:01,200 и тоа ќе се дефинира како int val 130 00:07:01,200 --> 00:07:05,420 и тоа ќе има покажувач кој покажува кон друга struct јазол., 131 00:07:05,420 --> 00:07:09,490 како и во структурата јазол * следната. 132 00:07:09,490 --> 00:07:13,670 А потоа ние ќе го нарекуваат јазол. 133 00:07:15,490 --> 00:07:18,020 Ова struct е рекурзивен, 134 00:07:18,020 --> 00:07:21,450 Од дефиницијата на struct јазол содржи во неа 135 00:07:21,450 --> 00:07:24,200 покажувач на struct јазол. 136 00:07:24,200 --> 00:07:27,740 Забележете дека ние треба да се каже struct јазол * следниот 137 00:07:27,740 --> 00:07:30,690 внатрешноста на дефиницијата на struct јазол, 138 00:07:30,690 --> 00:07:33,620 од типот дефиниција не е завршена уште да ни овозможи да се поедностави оваа 139 00:07:33,620 --> 00:07:36,210 само јазол * следната. 140 00:07:36,210 --> 00:07:39,260 Ќе дознаете повеќе за structs слични на овој 141 00:07:39,260 --> 00:07:41,750 кога се занимаваат со поврзани листи и дрвја. 142 00:07:41,750 --> 00:07:44,130 Што structs во функција? 143 00:07:44,130 --> 00:07:46,800 Ова е исто така совршено валидни. 144 00:07:46,800 --> 00:07:49,430 Ние би можеле да имаат 145 00:07:49,430 --> 00:07:53,630 поништат функции 146 00:07:53,630 --> 00:07:55,930 кој ги зема како аргумент, 147 00:07:55,930 --> 00:07:59,590 студент на 148 00:07:59,590 --> 00:08:02,790 и не нешто со што студентот. 149 00:08:05,270 --> 00:08:08,450 И потоа можеме да го помине како студент struct како тоа. 150 00:08:08,450 --> 00:08:12,850 Функции на S1 од порано. 151 00:08:12,850 --> 00:08:15,230 На struct однесува 152 00:08:15,230 --> 00:08:18,460 токму како цел број би, кога помина на функцијата. 153 00:08:18,460 --> 00:08:21,510 Функции добива копија од S1 154 00:08:21,510 --> 00:08:23,690 и затоа не може да го менува S1; 155 00:08:23,690 --> 00:08:27,110 Наместо тоа, само копија од тоа дека е се чуваат во С 156 00:08:27,110 --> 00:08:30,010 Ако сакате функцијата да биде во можност да менувате S1, 157 00:08:30,010 --> 00:08:33,000 функции ќе треба да се земе студентот * S, 158 00:08:33,000 --> 00:08:36,570 и ќе треба да помине S1 по адреса, како и толку. 159 00:08:37,549 --> 00:08:41,100 Студентски * S, функции и S1. 160 00:08:41,100 --> 00:08:44,760 Има уште една причина да помине адреса тука. 161 00:08:44,760 --> 00:08:48,030 Што ако нашите struct содржани 100 полиња? 162 00:08:48,030 --> 00:08:51,250 Секој пат кога ќе преминеме на студентите да функцио, 163 00:08:51,250 --> 00:08:55,770 нашата програма треба да го копирате сите оние 100 полиња во аргумент S функции е, 164 00:08:55,770 --> 00:08:59,320 дури и ако никогаш не го користи огромното мнозинство од нив. 165 00:08:59,320 --> 00:09:02,700 Па дури и ако функцијата не планирате за менување на студентот, 166 00:09:02,700 --> 00:09:05,170 ако сеуште може да бидат корисни да помине адреса. 167 00:09:05,170 --> 00:09:08,990 Океј, што ако сакаме да се создаде покажувач на struct? 168 00:09:08,990 --> 00:09:11,130 Можеме да направиме нешто како 169 00:09:11,130 --> 00:09:17,580 Студентот * S 170 00:09:17,580 --> 00:09:20,980 еднакво Примерок 171 00:09:20,980 --> 00:09:26,600 големината на студентот. 172 00:09:30,450 --> 00:09:33,590 Забележете дека големината на уште работи тука. 173 00:09:33,590 --> 00:09:37,260 Така како ние сега пристапите на возраст член 174 00:09:37,260 --> 00:09:39,640 на блок кој S поени? 175 00:09:39,640 --> 00:09:42,300 Прво ќе мислам да се направи 176 00:09:42,300 --> 00:09:47,970 * S.age = 4, 177 00:09:47,970 --> 00:09:50,220 но ова не е сосема ќе работат. 178 00:09:50,220 --> 00:09:52,940 Бидејќи ова навистина ќе се толкува како 179 00:09:52,940 --> 00:09:57,740 * S.age во загради = 4, 180 00:09:57,740 --> 00:10:00,160 кои дури и не ќе ги собере, 181 00:10:00,160 --> 00:10:03,600 бидејќи s не е struct или подобро покажувач кон struct, 182 00:10:03,600 --> 00:10:06,270 и така точка не ќе работат тука. 183 00:10:06,270 --> 00:10:08,860 Ние може да направи 184 00:10:08,860 --> 00:10:13,760 (* С). Возраст = 4 185 00:10:13,760 --> 00:10:16,790 но загради може да се досадни и збунувачки. 186 00:10:16,790 --> 00:10:19,880 За среќа, имаме посебна arrow оператор 187 00:10:19,880 --> 00:10:22,350 што изгледа нешто како 188 00:10:22,350 --> 00:10:28,860 S-> возраст = 4. 189 00:10:28,860 --> 00:10:31,600 Овие 2 начини на референцирање возраст 190 00:10:31,600 --> 00:10:33,270 се еквивалентни 191 00:10:33,270 --> 00:10:36,870 и ние навистина не некогаш треба стрелките на операторот, 192 00:10:36,870 --> 00:10:39,300 но тоа го прави работите изгледаат поубаво. 193 00:10:39,300 --> 00:10:43,050 Од S е покажувач кон некои блок од меморија, која содржи struct, 194 00:10:43,050 --> 00:10:47,820 можете да замислите С> возраст како што следи покажувачот стрелка 195 00:10:47,820 --> 00:10:50,250 и го имате на возраст член. 196 00:10:50,250 --> 00:10:53,750 Па зошто треба ние никогаш не се користи structs? 197 00:10:53,750 --> 00:10:57,560 Тоа е дефинитивно возможно да се извлечат само со примитивни цели броеви, 198 00:10:57,560 --> 00:10:59,050 знаци, совети и слично 199 00:10:59,050 --> 00:11:01,550 дека ние сме навикнати; 200 00:11:01,550 --> 00:11:03,340 наместо S1 и S2 пред, 201 00:11:03,340 --> 00:11:06,290 ние би можеле да имаат age1, age2, name1 и name2 202 00:11:06,290 --> 00:11:09,120 сите во одделни променливи. 203 00:11:09,120 --> 00:11:11,390 Ова е во ред со само 2 ученици, 204 00:11:11,390 --> 00:11:13,310 но што ако имавме 10 од нив? 205 00:11:13,310 --> 00:11:15,540 А што ако, наместо на само 2 полиња, 206 00:11:15,540 --> 00:11:17,720 студентот struct имаше 100 полиња? 207 00:11:17,720 --> 00:11:21,240 Успех, курсеви, коса боја, пол, и така натаму. 208 00:11:21,240 --> 00:11:25,790 Наместо само 10 structs, ние треба 1.000 одделни променливи. 209 00:11:25,790 --> 00:11:28,360 Исто така, сметаат функција 210 00:11:28,360 --> 00:11:32,270 кој ги зема дека struct со 100 полиња со единствен аргумент 211 00:11:32,270 --> 00:11:34,350 и отпечатоци од сите области. 212 00:11:34,350 --> 00:11:36,320 Ако ние не се користи структурата, 213 00:11:36,320 --> 00:11:38,540 секој пат кога ние го нарекуваме таа функција, 214 00:11:38,540 --> 00:11:41,460 ние треба да го поминат на сите 100 променливи, 215 00:11:41,460 --> 00:11:44,430 и ако имаме 100 променливи за студентски 1, 216 00:11:44,430 --> 00:11:47,020 и 100 променливи за студентски 2, 217 00:11:47,020 --> 00:11:50,540 ние треба да бидете сигурни дека ние не случајно поминуваат некои променливи од ученик 1 218 00:11:50,540 --> 00:11:52,910 а некои променливи од студент 2. 219 00:11:52,910 --> 00:11:55,710 Тоа е невозможно да се направи таа грешка со структурата, 220 00:11:55,710 --> 00:11:59,010 бидејќи сите 100 променливи се содржани во едно пакување. 221 00:11:59,010 --> 00:12:02,050 Само неколку конечниот белешки: 222 00:12:02,050 --> 00:12:04,870 Ако сте се разбере што до овој момент, одлично. 223 00:12:04,870 --> 00:12:07,900 Остатокот на видео е само заради комплетност. 224 00:12:07,900 --> 00:12:11,010 Бидејќи structs може да се одржи било кој тип на покажувач, 225 00:12:11,010 --> 00:12:14,220 тие исто така може да се одржи функција покажувачи. 226 00:12:14,220 --> 00:12:17,040 Ако сте запознаени со објектно ориентирано програмирање, 227 00:12:17,040 --> 00:12:21,790 ова обезбедува начин да се користи structs да програма во објектно ориентирано стил. 228 00:12:21,790 --> 00:12:24,500 Повеќе за функција покажувачи на некое друго време. 229 00:12:24,500 --> 00:12:27,760 Исто така, понекогаш може да имате 2 structs 230 00:12:27,760 --> 00:12:30,220 чии дефиниции зависат еден од друг. 231 00:12:30,220 --> 00:12:32,320 На пример, 232 00:12:32,320 --> 00:12:35,470 ние би можеле да имаат struct А, 233 00:12:35,470 --> 00:12:38,580 кој е дефиниран како 234 00:12:38,580 --> 00:12:41,910 покажувач на struct Б, 235 00:12:41,910 --> 00:12:47,180 struct Б * X, 236 00:12:47,180 --> 00:12:50,470 и сега може да имаме struct Б 237 00:12:53,890 --> 00:12:56,280 кој е дефиниран како покажувач 238 00:12:56,280 --> 00:12:59,180 на struct А, 239 00:12:59,180 --> 00:13:03,640 struct А * Ј 240 00:13:07,230 --> 00:13:09,060 Но, тоа не ќе состави, 241 00:13:09,060 --> 00:13:14,110 од struct Б не постои во тоа време дека struct А се составени. 242 00:13:14,110 --> 00:13:17,600 И ако ние трампа struct А и структурата Б, 243 00:13:17,600 --> 00:13:20,100 тогаш ние само ќе си бидат оставени со истиот проблем; 244 00:13:20,100 --> 00:13:22,640 овој пат, со struct А не постои. 245 00:13:22,640 --> 00:13:24,720 За да се реши ова, ние може да напише 246 00:13:24,720 --> 00:13:29,290 struct Б; 247 00:13:29,290 --> 00:13:32,460 пред дефинирањето на struct А 248 00:13:32,460 --> 00:13:35,590 Ова се нарекува напред декларација. 249 00:13:35,590 --> 00:13:38,590 Ова само им овозможува на компајлерот знае дека 250 00:13:38,590 --> 00:13:42,040 struct Б е валиден тип кој ќе биде целосно дефинирана подоцна или на друго место. 251 00:13:42,040 --> 00:13:45,980 Моето име е Роб Бауден, и ова е CS50. 252 00:13:45,980 --> 00:13:48,980 [CS50.TV]