1 00:00:07,260 --> 00:00:09,180 [Powered by Google Translate] Lassen Sie uns über Strukturen sprechen. 2 00:00:09,180 --> 00:00:12,130 Strukturen bieten uns einen Weg, um eine Reihe von Variablen gruppieren 3 00:00:12,130 --> 00:00:14,350 in ein schönes Paket. 4 00:00:14,350 --> 00:00:17,020 Es ist wohl am einfachsten, um ein Beispiel sofort sehen, 5 00:00:17,020 --> 00:00:20,030 so sagen wir struct, 6 00:00:20,030 --> 00:00:23,340 dann öffnenden geschweiften Klammer, 7 00:00:23,340 --> 00:00:26,630 und in dieser Struktur, wir haben einen int Alter, 8 00:00:28,920 --> 00:00:31,350 a char * name, 9 00:00:31,350 --> 00:00:34,670 und das ist es. 10 00:00:37,350 --> 00:00:40,650 Es mag mit einem Semikolon komisch nach einer geschweiften Klammer, 11 00:00:40,650 --> 00:00:43,620 aber es ist in der Tat notwendig mit Strukturen. 12 00:00:43,620 --> 00:00:46,270 Jede gültige Typ kann innerhalb des struct-Definition gehen. 13 00:00:46,270 --> 00:00:49,530 Hier haben wir ein int und char * verwendet, 14 00:00:49,530 --> 00:00:52,610 Sie können aber auch ein Array, von, sagen wir, 100 Elemente 15 00:00:52,610 --> 00:00:54,910 oder sogar eine andere Struktur. 16 00:00:54,910 --> 00:00:56,960 Wenn Sie mit Strukturen in C, 17 00:00:56,960 --> 00:00:58,430 Sie erstellen neue Arten 18 00:00:58,430 --> 00:01:00,860 aus einer Sammlung von anderen Typen. 19 00:01:00,860 --> 00:01:02,620 Hier machen wir eine neue Art 20 00:01:02,620 --> 00:01:05,060 aus einer ganzen Zahl und einer char *. 21 00:01:05,060 --> 00:01:07,400 Wie wir später sehen werden, eine Struktur geben 22 00:01:07,400 --> 00:01:10,700 ist in vielerlei Hinsicht äquivalent zu einem anderen Typ, den Sie gewohnt sind. 23 00:01:10,700 --> 00:01:13,310 Normalerweise werde ich vergleichen, wie ein struct-Typ 24 00:01:13,310 --> 00:01:15,790 ist ähnlich einer Integer-Typ. 25 00:01:15,790 --> 00:01:18,520 Während der Code schrieben wir gilt C, 26 00:01:18,520 --> 00:01:20,320 es ist nicht sehr nützlich, 27 00:01:20,320 --> 00:01:22,340 und Klang wird uns eine Warnung. 28 00:01:22,340 --> 00:01:24,970 Erinnere dich, wie Strukturen und ihre ähnlich sind? 29 00:01:24,970 --> 00:01:26,710 Nun, wir im Grunde nur gesagt 30 00:01:27,840 --> 00:01:30,060 int, 31 00:01:30,060 --> 00:01:33,140 was nicht sehr hilfreich Linie. 32 00:01:33,140 --> 00:01:35,760 Lassen Sie uns also tatsächlich eine Variable dieses Typs 33 00:01:35,760 --> 00:01:38,760 indem sie ihm einen Namen vor dem Semikolon. 34 00:01:42,170 --> 00:01:45,000 Wir rufen die Variable Schüler. 35 00:01:48,190 --> 00:01:51,350 Jetzt haben wir eine Variable deklariert genannte Student 36 00:01:51,350 --> 00:01:53,980 mit der Art der Struktur gegeben. 37 00:01:53,980 --> 00:01:56,730 Wie reagieren wir auf die Variablen innerhalb der Struktur zu bekommen? 38 00:01:56,730 --> 00:01:59,040 Technisch sind die Namen für diese Variablen 39 00:01:59,040 --> 00:02:01,070 Mitglieder sind. 40 00:02:01,070 --> 00:02:04,000 Um ein bestimmtes Element in einer studentischen struct zugreifen, 41 00:02:04,000 --> 00:02:06,440 Sie fügen einen Punkt an den Namen der Variablen, 42 00:02:06,440 --> 00:02:08,860 gefolgt von dem Namen des Mitglieds Sie wollen. 43 00:02:08,860 --> 00:02:11,690 Also hier sind die einzigen 2 gültig Möglichkeiten 44 00:02:11,690 --> 00:02:17,760 sind student.age 45 00:02:17,760 --> 00:02:24,460 und student.name. 46 00:02:24,460 --> 00:02:26,820 Und wir können etwas tun 47 00:02:26,820 --> 00:02:30,320 student.age = 12 48 00:02:30,320 --> 00:02:39,310 und student.name = Student. 49 00:02:39,310 --> 00:02:42,580 Was nun, wenn wir eine zweite Student machen wollte? 50 00:02:42,580 --> 00:02:44,760 Man könnte denken, zu kopieren und diese Zeilen 51 00:02:44,760 --> 00:02:48,110 und ändern Sie Schüler zu Schüler 2 oder so etwas, 52 00:02:48,110 --> 00:02:50,090 und das wird funktionieren, 53 00:02:50,090 --> 00:02:52,670 aber technisch, Schüler und Studenten 2 54 00:02:52,670 --> 00:02:54,540 nicht über den gleichen Typ. 55 00:02:54,540 --> 00:02:56,940 Siehe, werden Sie nicht in der Lage sein, um sie miteinander zuweisen. 56 00:02:56,940 --> 00:02:58,560 Dies liegt daran, so weit, 57 00:02:58,560 --> 00:03:00,950 Ihre Struktur ist anonym. 58 00:03:00,950 --> 00:03:02,290 Wir müssen ihm einen Namen geben. 59 00:03:02,290 --> 00:03:04,420 Um dies zu tun, legen wir den Namen der Struktur 60 00:03:04,420 --> 00:03:06,950 nach dem Wort struct. 61 00:03:09,440 --> 00:03:11,170 Schüler, 62 00:03:11,170 --> 00:03:14,680 gefolgt von der Definition. 63 00:03:16,500 --> 00:03:18,940 Wir können immer noch sofort eine Variable vom Typ 64 00:03:18,940 --> 00:03:21,570 struct Student, wie wir früher. 65 00:03:24,320 --> 00:03:28,360 Wir nennen es S1 66 00:03:28,590 --> 00:03:30,760 Indem die Struktur einen Namen, 67 00:03:30,760 --> 00:03:33,050 Wir können jetzt struct student 68 00:03:33,050 --> 00:03:36,950 in fast genau der gleichen Weise würden wir verwenden int. 69 00:03:36,950 --> 00:03:39,580 So können wir eine Variable vom Typ struct Student, 70 00:03:39,580 --> 00:03:42,360 wie 71 00:03:42,360 --> 00:03:49,500 struct student S2. 72 00:03:51,020 --> 00:03:55,130 Wie Arrays bieten structs eine Verknüpfung Initialisierungssyntax, 73 00:03:55,130 --> 00:03:58,670 so können wir sagen, struct student S2 74 00:03:58,670 --> 00:04:01,420 gleich 75 00:04:01,420 --> 00:04:06,040 geschweiften Klammer 3, S2. 76 00:04:09,210 --> 00:04:12,600 Hier wird S2.age 3 sein kann, 77 00:04:12,600 --> 00:04:15,910 und S2.name wird auf S2 weisen. 78 00:04:15,910 --> 00:04:19,149 Denken Sie an all die Dinge, die Sie tun können, mit einem int-Typ 79 00:04:19,149 --> 00:04:22,460 und die meisten von ihnen können mit einem struct student Typ zu tun. 80 00:04:22,460 --> 00:04:26,060 Wir können eine struct Schüler als Typ einer Funktion Parameter verwenden. 81 00:04:26,060 --> 00:04:28,790 Wir können struct student Inneren einer neuen Struktur zu verwenden. 82 00:04:28,790 --> 00:04:31,010 Wir können einen Zeiger auf eine struct student. 83 00:04:31,010 --> 00:04:33,540 Wir können Größe struct student. 84 00:04:33,540 --> 00:04:35,510 Struct Studenten ist eine Art 85 00:04:35,510 --> 00:04:38,030 wie int ist ein Typ. 86 00:04:38,030 --> 00:04:40,540 Wir können auch S1 bis S2 zuordnen 87 00:04:40,540 --> 00:04:43,760 da beide vom gleichen Typ sind, so können wir tun 88 00:04:44,390 --> 00:04:47,540 S1 = S2. 89 00:04:47,540 --> 00:04:50,430 Was passiert, wenn wir tun 90 00:04:50,430 --> 00:04:55,300 S1.age = 10? 91 00:04:56,340 --> 00:04:58,880 Hat S2 Veränderung überhaupt? 92 00:04:58,880 --> 00:05:02,800 Auch der Strukturen ebenso wie regelmäßige Zahlen denken. 93 00:05:02,800 --> 00:05:05,590 Wenn wir weisen einige int X bis zu einem gewissen int Y, 94 00:05:05,590 --> 00:05:08,970 wie X = Y 95 00:05:08,970 --> 00:05:10,850 und ändern Sie dann X, 96 00:05:10,850 --> 00:05:14,230 wie in X + +, 97 00:05:14,230 --> 00:05:17,020 ist Y überhaupt ändern? 98 00:05:17,020 --> 00:05:20,980 Y hier nicht ändern, und so auch nicht S2 oben. 99 00:05:20,980 --> 00:05:24,120 S2.age noch 3. 100 00:05:24,120 --> 00:05:27,350 Aber beachten Sie, dass bei der Vergabe ein struct zum anderen, 101 00:05:27,350 --> 00:05:30,300 alle Zeiger immer noch auf die gleiche Sache, 102 00:05:30,300 --> 00:05:32,260 da sie nur kopiert. 103 00:05:32,260 --> 00:05:34,300 Wenn Sie nicht wollen, dass die Zeiger auf geteilt werden, 104 00:05:34,300 --> 00:05:36,100 Sie müssen manuell behandeln, dass 105 00:05:36,100 --> 00:05:39,780 vielleicht durch malicking ein Speicherblock für einen der Zeiger auf, darauf 106 00:05:39,780 --> 00:05:42,120 und Kopieren der Daten über. 107 00:05:42,120 --> 00:05:45,540 Es ist zwar lästig zu müssen struct student überall schreiben. 108 00:05:45,540 --> 00:05:48,730 Mit einer Art def, können wir tun, 109 00:05:51,630 --> 00:05:55,850 Typ def 110 00:05:55,850 --> 00:05:58,830 struct 111 00:05:58,830 --> 00:06:01,270 und wir nennen es Schüler. 112 00:06:05,620 --> 00:06:08,360 Jetzt können wir Studenten überall verwenden 113 00:06:08,360 --> 00:06:11,090 dass wir zur struct student verwenden. 114 00:06:11,090 --> 00:06:13,410 Diese Art def ist eine anonyme struct 115 00:06:13,410 --> 00:06:15,750 und nennt es Schüler. 116 00:06:15,750 --> 00:06:18,220 Aber wenn wir auch halten die Schüler Kennung 117 00:06:18,220 --> 00:06:22,380 neben dem Wort struct, wie in typedef struct Student, 118 00:06:27,670 --> 00:06:31,590 konnten wir sowohl struct Student und Schüler synonym verwenden jetzt. 119 00:06:31,590 --> 00:06:34,060 Sie haben nicht einmal den gleichen Namen haben. 120 00:06:34,060 --> 00:06:36,710 Wir könnten def struct Student Bob geben 121 00:06:36,710 --> 00:06:38,950 und dann struct Student und Bob 122 00:06:38,950 --> 00:06:41,270 würde austauschbaren Typen sein. 123 00:06:41,270 --> 00:06:44,050 Unabhängig von der Art def, 124 00:06:44,050 --> 00:06:46,750 wir brauchen die Kennung neben struct 125 00:06:46,750 --> 00:06:48,250 wenn die Definition der Struktur 126 00:06:48,250 --> 00:06:50,450 rekursiv ist. 127 00:06:50,450 --> 00:06:52,620 Beispielsweise 128 00:06:52,620 --> 00:06:56,140 Typ def struct node 129 00:06:56,140 --> 00:07:01,200 und es wird als int val definiert werden 130 00:07:01,200 --> 00:07:05,420 und es wird über einen Zeiger, dass zu einem anderen struct node verweist., 131 00:07:05,420 --> 00:07:09,490 wie in struct node * next. 132 00:07:09,490 --> 00:07:13,670 Und dann werden wir es nennen Knoten. 133 00:07:15,490 --> 00:07:18,020 Diese Struktur ist rekursiv, 134 00:07:18,020 --> 00:07:21,450 da die Definition von struct node enthält in sich 135 00:07:21,450 --> 00:07:24,200 ein Zeiger auf eine struct Knoten. 136 00:07:24,200 --> 00:07:27,740 Beachten Sie, dass wir sagen, struct node * next haben 137 00:07:27,740 --> 00:07:30,690 Innenseite der Definition der Struktur Knoten 138 00:07:30,690 --> 00:07:33,620 da die Art def wurde noch zu erlauben uns fertig zu vereinfachen diese 139 00:07:33,620 --> 00:07:36,210 nur node * next. 140 00:07:36,210 --> 00:07:39,260 Sie lernen mehr über Strukturen ähnlich wie diese 141 00:07:39,260 --> 00:07:41,750 beim Umgang mit verknüpften Listen und Bäumen. 142 00:07:41,750 --> 00:07:44,130 Was Strukturen in einer Funktion? 143 00:07:44,130 --> 00:07:46,800 Dies ist auch völlig in Ordnung. 144 00:07:46,800 --> 00:07:49,430 Wir könnten 145 00:07:49,430 --> 00:07:53,630 void func 146 00:07:53,630 --> 00:07:55,930 die als Argument, 147 00:07:55,930 --> 00:07:59,590 Student s 148 00:07:59,590 --> 00:08:02,790 und tut etwas mit diesem Schüler. 149 00:08:05,270 --> 00:08:08,450 Und dann können wir es als Student struct vergehen wie so. 150 00:08:08,450 --> 00:08:12,850 Func der S1 von früher. 151 00:08:12,850 --> 00:08:15,230 Die Struktur verhält 152 00:08:15,230 --> 00:08:18,460 genau wie eine ganze Zahl würde, wenn an eine Funktion übergeben. 153 00:08:18,460 --> 00:08:21,510 Func erhält eine Kopie der S1 154 00:08:21,510 --> 00:08:23,690 und so kann nicht geändert werden S1; 155 00:08:23,690 --> 00:08:27,110 sondern nur die Kopie das ist in S. gespeichert 156 00:08:27,110 --> 00:08:30,010 Wenn Sie die Funktion in der Lage sein S1 zu ändern, 157 00:08:30,010 --> 00:08:33,000 Funktionen müssen ein Student * S zu nehmen, 158 00:08:33,000 --> 00:08:36,570 und Sie haben die S1 nach Adresse übergeben, wie so. 159 00:08:37,549 --> 00:08:41,100 Student * S, Funk & S1. 160 00:08:41,100 --> 00:08:44,760 Es gibt einen weiteren Grund, nach Adresse hier vorbei. 161 00:08:44,760 --> 00:08:48,030 Was, wenn unser struct 100 Felder enthalten? 162 00:08:48,030 --> 00:08:51,250 Jedes einzelne Mal passieren wir einen Schüler, func, 163 00:08:51,250 --> 00:08:55,770 unser Programm muss alle diese 100 Felder in Funktion das Argument S kopieren, 164 00:08:55,770 --> 00:08:59,320 auch wenn es nie verwendet die überwiegende Mehrheit von ihnen. 165 00:08:59,320 --> 00:09:02,700 Also selbst wenn Funktionen nicht über eine Änderung der Studenten planen, 166 00:09:02,700 --> 00:09:05,170 wenn immer noch wertvoll sein, um nach Adresse weitergeben. 167 00:09:05,170 --> 00:09:08,990 Okay, was ist, wenn wir einen Zeiger auf eine struct erstellen möchten? 168 00:09:08,990 --> 00:09:11,130 Wir könnten etwas tun 169 00:09:11,130 --> 00:09:17,580 Studenten * S 170 00:09:17,580 --> 00:09:20,980 gleich malloc 171 00:09:20,980 --> 00:09:26,600 Größe der Schüler. 172 00:09:30,450 --> 00:09:33,590 Beachten Sie, dass die Größe der funktioniert immer noch hier. 173 00:09:33,590 --> 00:09:37,260 Wie können wir also nun auf das Alter Mitglied 174 00:09:37,260 --> 00:09:39,640 des Blocks, S Punkte? 175 00:09:39,640 --> 00:09:42,300 Man könnte zunächst denken zu tun 176 00:09:42,300 --> 00:09:47,970 * S.age = 4, 177 00:09:47,970 --> 00:09:50,220 aber das wird nicht ganz funktioniert. 178 00:09:50,220 --> 00:09:52,940 Da dies wirklich so interpretiert werden 179 00:09:52,940 --> 00:09:57,740 * S.age in Klammern = 4, 180 00:09:57,740 --> 00:10:00,160 die nicht einmal kompilieren, 181 00:10:00,160 --> 00:10:03,600 da S ist kein struct oder eher ein Zeiger auf eine Struktur, 182 00:10:03,600 --> 00:10:06,270 und so der Punkt wird hier nicht funktionieren. 183 00:10:06,270 --> 00:10:08,860 Wir könnten 184 00:10:08,860 --> 00:10:13,760 (* S). Age = 4 185 00:10:13,760 --> 00:10:16,790 aber die Klammern kann man ärgerlich und verwirrend. 186 00:10:16,790 --> 00:10:19,880 Zum Glück haben wir eine besondere Pfeiloperators 187 00:10:19,880 --> 00:10:22,350 das sieht so etwas wie 188 00:10:22,350 --> 00:10:28,860 S-> age = 4. 189 00:10:28,860 --> 00:10:31,600 Diese 2 Arten der Referenzierung Alter 190 00:10:31,600 --> 00:10:33,270 äquivalent 191 00:10:33,270 --> 00:10:36,870 und wir wissen nicht wirklich jemals brauchen den Pfeil-Operator, 192 00:10:36,870 --> 00:10:39,300 aber es macht die Dinge schöner aussehen. 193 00:10:39,300 --> 00:10:43,050 Da S ist ein Zeiger auf eine Speicherblock, der die Struktur enthält, 194 00:10:43,050 --> 00:10:47,820 Sie können S> Alter denken die Verfolgung der Mauspfeil 195 00:10:47,820 --> 00:10:50,250 und greifen Sie das Alter Mitglied. 196 00:10:50,250 --> 00:10:53,750 Also warum sollten wir jemals Structs verwenden? 197 00:10:53,750 --> 00:10:57,560 Es ist definitiv möglich, sich mit nur den primitiven Ganzzahlen 198 00:10:57,560 --> 00:10:59,050 Zeichen, Zeiger und dergleichen 199 00:10:59,050 --> 00:11:01,550 dass wir zur; 200 00:11:01,550 --> 00:11:03,340 anstelle von S1 und S2 vor, 201 00:11:03,340 --> 00:11:06,290 wir hätten age1, age2, name1 und name2 202 00:11:06,290 --> 00:11:09,120 alle auf separate Variablen. 203 00:11:09,120 --> 00:11:11,390 Dies ist mit nur 2 Studenten in Ordnung, 204 00:11:11,390 --> 00:11:13,310 aber was, wenn wir 10 von ihnen hatten? 205 00:11:13,310 --> 00:11:15,540 Und was, wenn statt nur 2 Felder, 206 00:11:15,540 --> 00:11:17,720 der Student struct hatte 100 Felder? 207 00:11:17,720 --> 00:11:21,240 GPA, Kurse, Haarfarbe, Geschlecht und so weiter. 208 00:11:21,240 --> 00:11:25,790 Statt nur 10 Strukturen, brauchen wir 1.000 separate Variablen. 209 00:11:25,790 --> 00:11:28,360 Bedenken Sie außerdem, eine Funktion 210 00:11:28,360 --> 00:11:32,270 das dauert, dass struct mit 100 Feldern mit seinen einziges Argument 211 00:11:32,270 --> 00:11:34,350 und druckt alle Felder aus. 212 00:11:34,350 --> 00:11:36,320 Wenn wir nicht mit einem struct, 213 00:11:36,320 --> 00:11:38,540 jedes einzelne Mal, wir nennen diese Funktion, 214 00:11:38,540 --> 00:11:41,460 Wir müssen auf allen 100 Variablen übergeben 215 00:11:41,460 --> 00:11:44,430 und wenn wir 100 Variablen für Schüler 1, 216 00:11:44,430 --> 00:11:47,020 und 100 Variablen für Schüler 2, 217 00:11:47,020 --> 00:11:50,540 Wir müssen sicher sein, wir nicht versehentlich passieren einige Variablen aus student 1 218 00:11:50,540 --> 00:11:52,910 und einige Variablen aus Studenten 2. 219 00:11:52,910 --> 00:11:55,710 Es ist unmöglich, diesen Fehler mit einem struct machen, 220 00:11:55,710 --> 00:11:59,010 da alle 100 Variablen in einem einzigen Paket besteht. 221 00:11:59,010 --> 00:12:02,050 Nur ein paar abschließende Bemerkungen: 222 00:12:02,050 --> 00:12:04,870 Wenn Sie alles bis zu diesem Punkt, große verstanden. 223 00:12:04,870 --> 00:12:07,900 Der Rest des Videos ist nur der Vollständigkeit halber. 224 00:12:07,900 --> 00:12:11,010 Da Strukturen können jede Art von Zeiger zu halten, 225 00:12:11,010 --> 00:12:14,220 sie können auch Hold-Funktion Zeiger. 226 00:12:14,220 --> 00:12:17,040 Wenn Sie vertraut mit der objektorientierten Programmierung, 227 00:12:17,040 --> 00:12:21,790 Diese bietet die Möglichkeit, Strukturen zu bedienendes Programm in einer objektorientierten Stil. 228 00:12:21,790 --> 00:12:24,500 Mehr über Funktionszeiger zu einer anderen Zeit. 229 00:12:24,500 --> 00:12:27,760 Auch, manchmal müssen Sie möglicherweise zwei Strukturen 230 00:12:27,760 --> 00:12:30,220 deren Definitionen sind voneinander abhängig. 231 00:12:30,220 --> 00:12:32,320 Beispielsweise 232 00:12:32,320 --> 00:12:35,470 wir hätten struct A, 233 00:12:35,470 --> 00:12:38,580 welches definiert ist als 234 00:12:38,580 --> 00:12:41,910 ein Zeiger auf eine struct B, 235 00:12:41,910 --> 00:12:47,180 struct B * X, 236 00:12:47,180 --> 00:12:50,470 und jetzt können wir einen struct B 237 00:12:53,890 --> 00:12:56,280 Welches ist als Zeiger definiert 238 00:12:56,280 --> 00:12:59,180 zu einem struct A, 239 00:12:59,180 --> 00:13:03,640 struct A * Y. 240 00:13:07,230 --> 00:13:09,060 Aber das wird nicht kompiliert, 241 00:13:09,060 --> 00:13:14,110 Da struct B nicht zu dem Zeitpunkt, struct A wird kompiliert existieren. 242 00:13:14,110 --> 00:13:17,600 Und wenn wir tauschen struct A und struct B, 243 00:13:17,600 --> 00:13:20,100 dann würden wir nur mit dem gleichen Problem überlassen werden; 244 00:13:20,100 --> 00:13:22,640 diesmal mit struct A nicht vorhanden. 245 00:13:22,640 --> 00:13:24,720 Um dieses Problem zu lösen, können wir schreiben 246 00:13:24,720 --> 00:13:29,290 struct B; 247 00:13:29,290 --> 00:13:32,460 vor der Definition von struct A. 248 00:13:32,460 --> 00:13:35,590 Dies ist eine vorausschauende Erklärung genannt. 249 00:13:35,590 --> 00:13:38,590 Dies nur erlaubt der Compiler wissen, dass 250 00:13:38,590 --> 00:13:42,040 struct B ist ein gültiger Typ, vollständig definiert wird später oder anderswo. 251 00:13:42,040 --> 00:13:45,980 Mein Name ist Rob Bowden, und dies ist CS50. 252 00:13:45,980 --> 00:13:48,980 [CS50.TV]