>> [Musikwiedergabe]
DOUG LLOYD: Alles klar.
Arbeiten mit Einzel Variablen ist ziemlich lustig.
Aber was, wenn wir wollen, um zu arbeiten mit einer Menge von Variablen,
aber wir wollen nicht einen Haufen haben verschiedene Namen um unseren Code fliegen?
In diesem Fall sind Arrays wird kommen in wirklich praktisch.
Arrays sind eine wirklich fundamentale Daten Struktur für jede Programmiersprache
dass Sie verwenden.
Und sie sind wirklich sehr, sehr nützlich, besonders, wie wir sehen werden, in CS 50.
>> Wir verwenden Arrays zu halten Werte desselben Datentyps
an zusammenhängenden Speicherplätzen.
Das heißt, es ist ein so können wir Gruppe
ein Haufen von ganzen Zahlen zusammen Speicher oder eine Gruppe von Zeichen
oder schwimmt im Speicher wirklich nah zusammen und arbeiten
mit ihnen ohne jede geben hat seinen eigenen eindeutigen Namen, denen
zu umständlich nach einer Weile.
>> Nun, ein Weg, um Arrays analogize ist es, zu Ihrem örtlichen Post denken
Büro für eine Sekunde.
So Schritt weg von der Programmierung und nur die Augen zu schließen
und Visualisierung in Ihrem Verstand Ihrem örtlichen Postamt.
Normalerweise in den meisten post Büros, es gibt eine große Bank
ein Postfächer an der Wand.
>> Ein Array ist ein riesiger Block zusammenhängenden Speicher,
in der gleichen Weise, dass eine E-Mail Bank in Ihrem Postamt
ist ein großer Raum auf der Wand der Post.
Arrays haben in kleine unterteilt worden ist, gleich großen Blöcken von Raum,
von denen jedes eine genannte Element, auf die gleiche Weise, daß die Wand des Pfostens
Büro hat in kleine unterteilt worden ist, gleich großen Blöcken von Raum,
dem ein Postfach nennen wir.
Jedes Element des Arrays speichern eine bestimmte Datenmenge,
so wie jedes Postfach in der Lage ist um eine bestimmte Menge von Postsendungen zu halten.
>> Was in jedem Element gespeichert werden das Array-Variablen des gleichen Daten
Typ wie int oder char, nur wie in Ihrem Postfach,
können Sie nur die Dinge passen eines ähnlichen Typs,
wie Briefe oder Päckchen.
Schließlich können wir jedes Element zugreifen das Array direkt nach Indexnummer,
so wie wir unsere Post-Office zugreifen kann Box von zu wissen, seine Mailbox-Nummer.
Ich hoffe, dass analog hilft Ihnen, den Kopf zu bekommen
um die Idee des Arrays Analogisierung etwas anderes
dass Sie wahrscheinlich sind bereits mit.
>> In C, die Elemente eines Arrays indiziert ausgehend von 0, nicht 1.
Und das ist wirklich wichtig.
Und in der Tat ist der Grund, warum wir in CS 50, und warum Informatiker häufig
wird von 0 zu zählen, ist weil C die Arrays
Indexierung, die stets bei 0 beginnt.
Also, wenn ein Array aus n Elementen, das erste Element des Arrays
wird bei Index 0 liegt, und das letzte Element des Arrays
wird bei Index n minus 1 entfernt.
Auch wenn es n Elemente in unserer Array, ist die letzte Index n minus 1.
>> Also, wenn unser Angebot hat 50 Elemente, die erste Element bei Index 0 liegt,
und das letzte Element wird bei Index 49 entfernt.
Leider oder zum Glück, je nach Perspektive,
C ist hier sehr nachsichtig.
Es wird nicht verhindern, dass Sie gehen außerhalb der Grenzen des Arrays.
Sie konnten die minus zugreifen 3 Element Ihrer Array
oder das 59. Element des Array, wenn Ihr Array hat nur 50 Elemente.
Es wird nicht Ihr Programm aus zu stoppen Kompilieren, aber während der Laufzeit,
Sie stoßen könnten ein gefürchtete Segmentation Fault
wenn Sie beginnen, Speicher zugreifen dh außerhalb der Grenzen, was
Sie aufgefordert Ihr Programm, um Ihnen.
Also seien Sie vorsichtig.
>> Was bedeutet ein Array Erklärung aus?
Wie kommen wir zu codieren eine Reihe ins Leben wie wir andere variable Code?
Es gibt drei Teile zu einer Anordnung declaration-- einen Typ, ein Name,
und eine Größe.
Dies ist sehr ähnlich zu einem Variablendeklaration, die
ist nur ein Typ und ein Name, wobei die Größe Element
der Spezialfall für ein Array, denn wir werden immer ein paar von ihnen
gleichzeitig.
>> Also der Typ ist, welche Art von Variablen, die Sie soll jedes Element der Anordnung ist.
Sie wollen, dass es auf ein Array von ganzen Zahlen?
Dann sollten Sie Ihre Datentyp int sein.
Haben Sie wollen, dass es eine sein, Array von Double oder schwimmt?
Datentyp sollte doppelt so hoch sein oder schweben.
Der Name ist, was Sie möchten Ihre Array nennen.
Was sagen Sie zu diesen Riesen nennen wollen Bank von ganzen Zahlen oder Schwimmern oder chars
oder Doppel, oder was auch immer Sie haben?
Was wollen Sie es nennen?
Ziemlich selbsterklärend.
>> Schließlich Größe, die geht Innenseite der eckigen Klammern,
ist, wie viele Elemente würden Sie, wie Ihr Array enthalten.
Wie viele Zahlen wollen Sie?
Wie viele Schwimmer wollen Sie?
>> So zum Beispiel, int Schülergrade 40.
Dies erklärt, ein Array namens Studenten Typen, die aus 40 Zahlen besteht.
Ziemlich selbsterklärend, hoffe ich.
Hier ein weiteres Beispiel.
Doppel Menü Preise 8.
Dadurch entsteht ein Array mit dem Namen Menüpreise, die aus
Platz im Speicher für acht Doppelzimmer.
>> Wenn Sie jedes Element zu denken von einem Array vom Typ Datentyp,
so zum Beispiel ein einzelnes Element ein Array vom Typ int, die gleiche Weise
würde jedes anderen denken Variable vom Typ int,
alle bekannten Operationen, dass wir zuvor in den Operationen diskutiert
Video wird sinnvoll.
So, hier konnten wir ein Array deklarieren von Booleans genannte Wahrheitstabelle,
der aus Raum für 10 Booleans.
>> Und dann, so wie wir nur zuweisen könnte ein Wert, der jedem anderen Variablen des Typs
Boolean, könnten wir etwas sagen wie Wahrheitstabelle eckige Klammer
2, das ist, wie wir zeigen, das Element der Wahrheitstabelle?
Das dritte Element der Wahrheitstabelle, denn denken Sie daran,
wir sind von 0 zu zählen.
Also das ist, wie wir zeigen die dritte Element der Wahrheitstabelle.
Wahrheitstabelle 2 ist gleich falsch, so wie wir declare-- könnte
oder wir könnten zuzuweisen, statt jede Typ Boolean Variable falsch sein.
>> Wir können auch in Bedingungen verwenden.
if (Wahrheitstabelle 7 == true), das heißt,
wenn das achte Element der Wahrheitstabelle ist wahr,
vielleicht werden wir um eine Nachricht zu drucken möchten dem Benutzer, printf ("TRUE! n") ;.
Das bewirkt, dass wir sagen, Wahrheitstabelle 10 ist gleich wahr, oder?
Nun, ich kann, aber es ist ziemlich gefährlich, weil daran erinnern,
Wir haben eine Reihe von 10 Booleans.
So der höchste Index, der die Compiler hat uns ist 9.
>> Dieses Programm wird kompiliert, aber wenn etwas anderes im Speicher
vorhanden ist, wo wir erwarten Wahrheitstabelle 10 zu gehen,
wir könnten einen Segmentation Fault zu leiden. Wir vielleicht weg mit ihm, aber im Allgemeinen,
ziemlich gefährlich.
Also, was ich hier mache ist legal C, aber nicht notwendigerweise der beste Zug.
Nun, wenn Sie zu erklären und gleichzeitig initialisiert ein Array,
gibt es eigentlich ein ziemlich spezielle Syntax, die Sie
verwenden können, um füllen Sie das Array mit ihren Startwerten.
Es kann mühsam zu bekommen erklären, eine Reihe von Größe 100,
und dann haben zu sagen, Element 0 entspricht dies; Element 1 entspricht dies;
Element 2 entspricht, daß.
Was ist der Sinn, nicht wahr?
>> Wenn es ein kleines Array, Sie könnte so etwas wie dies zu tun.
Bool Wahrheitstabelle 3 gleich öffnen geschweifte Klammer und dann Komma
trennen Sie die Liste der Elemente dass Sie in dem Feld setzen möchten.
Dann schließen Sie geschweifte Klammer Semikolon.
Dies schafft eine Anordnung von Größe drei genannten Wahrheitstabelle,
mit Elementen false, true, und wahr.
Und in der Tat ist die Instanziierung Syntax Ich habe hier
genau das gleiche wie das zu tun Einzelelementsyntax unten.
Diese beiden Arten der Codierung daher erzeugen die exakt gleiche Array.
>> In ähnlicher Weise haben wir durchlaufen könnte über alle Elemente
von einem Array mit einer Schleife, die in Tatsächlich ist ein sehr stark empfohlen
at-home Übung.
Wie kann man ein Array zu erstellen von 100 Zahlen, wobei
jedes Element des Arrays ist sein Index?
So zum Beispiel, haben wir eine Reihe von 100 ganze Zahlen sind, und in dem ersten Element,
wir wollen, auf 0 gesetzt.
In dem zweiten Element, möchten wir 1 gesetzt.
Im dritten Element, wir wollen zu 2 gesetzt; und so weiter und so fort.
Das ist eine wirklich gute at-home Übung, um das zu tun.
>> Hier ist es nicht aussieht wie zu viel hat sich geändert.
Aber beachten Sie, dass zwischen dem eckige Klammern, diesmal,
Ich habe tatsächlich verzichtet die Nummer.
Wenn Sie mit diesem sehr Sonder Instanziierung
Syntax, um eine zu erstellen Arrays, die Sie tatsächlich nicht
müssen die Größe anzuzeigen des Arrays voraus.
Der Compiler ist intelligent genug, tatsächlich zu wissen, dass Sie
möchten ein Array der Größe 3, weil Sie drei Elemente setzen
auf der rechten Seite des Gleichheitszeichens.
Wenn Sie vier gesetzt hatte, sie hätte gegeben Sie eine Wahrheitstabelle der Größe vier;
und so weiter und so fort.
>> Arrays sind nicht auf eine einzige beschränkt Dimension, die ziemlich cool ist.
Sie können tatsächlich so viele Seitenbezeich wie Sie möchten.
So zum Beispiel, wenn Sie erstellen möchten ein Forum für das Spiel Schlachtschiff, das,
wenn Sie jemals gespielt wird, ist ein Spiel, das ist mit Zapfen auf der 10 mal 10 Gitter gespielt,
Sie könnte ein Array wie folgt erstellen.
Man könnte sagen, Bool Schlachtschiff eckige Klammer 10
geschlossene eckige Klammer Quadrat Klammer 10 geschlossen eckige Klammer.
>> Und dann können Sie wählen, interpretieren dies im Kopf als 10
von 10 Raster von Zellen.
Nun in der Tat, in einem Speicher, es funktioniert wirklich einfach
bleiben ein 100-Element, eindimensionale Array.
Und dies in der Tat, geht für, wenn Sie haben drei Dimensionen oder vier oder fünf.
Es ist wirklich einfach nicht vermehren alle der indices--
oder alle der Größe specifiers-- zusammen,
und du nur eine eindimensionale Array dieser Größe.
>> Aber in Bezug auf Organisation und Visualisierung und die menschliche Wahrnehmung,
es viel einfacher sein kann, mit einem Gitter zu arbeiten
wenn Sie an einem Spiel arbeitest wie Tic-Tac-Toe oder Schlachtschiff,
oder etwas ähnliches.
Es ist eine große Abstraktion, anstatt
um eine Tic-Tac-Toe denken Board als eine Linie von neun
Quadrate oder ein Schlachtschiff Brett als eine Linie von 100 Plätzen.
Ein 10 x 10 Raster oder einem Drei um drei Gitter ist wahrscheinlich
viel mehr leicht zu erkennen.
>> Nun, etwas wirklich Wichtiges über Arrays.
Wir können jede einzelne Behandlung Element des Arrays als eine Variable.
Wir sahen, dass früher als wir die Zuordnung
den Wert True, um bestimmte Booleans oder testen sie in conditionals.
Aber wir können nicht behandeln gesamte Arrays sich als Variablen.
Wir können nicht, zum Beispiel, weisen Sie einem Array zu einem anderen Array mit dem Zuweisungs
Operator.
Es ist nicht legal C.
>> Wenn wir wollen, was für example-- wir in diesem Beispiel tut werden
wäre eine Anordnung in eine andere zu kopieren.
Wenn wir, dass wir eigentlich machen wollen müssen Sie eine Schleife über die zu kopier
jedes Einzelelement eine zu einem Zeitpunkt.
Ich weiß, es ist ein wenig zeitaufwendig.
>> So zum Beispiel, wenn wir diese paar von Zeilen Code, würde das funktionieren?
Nun, nein, wäre es nicht, oder?
Da wir versuchen, um Nahrung zu bar zuweisen.
Das ist nicht zur Arbeit gehen, denn es ist ein Array,
und wir gerade beschrieben , dass das nicht legal C.
>> Stattdessen, wenn wir wollen den Inhalt von Lebensmitteln kopieren
in bar, was was ist wir versuchen, hier zu tun,
wir eine Syntax wie folgt benötigen würde.
Wir haben eine for-Schleife das geht von J gleich 0 bis 5,
und wir inkrementieren J an jeder Iteration die Schleife und weisen Elemente so.
Dies würde in bar auch zur Folge haben wobei ein, zwei, drei, vier, fünf,
aber wir wollen es dieses sehr zu tun haben langsame Element für Element Weise
statt nur um Kopieren des gesamten Arrays.
In anderen Programmiersprachen Sprachen, modernere,
Sie können in der Tat tun, nur So einfach ist gleich Syntax.
Aber C, leider sind wir nicht erlaubt, das zu tun.
>> Jetzt gibt es einen weiteren Sache, die ich erwähnen möchte,
über Arrays, die ein wenig sein kann, etwas schwierig das erste Mal
mit ihnen arbeiten.
Wir in einem Video diskutiert über den Geltungsbereich von Variablen,
dass die meisten Variablen in C, wenn Sie anrufen sie in Funktionen als Wert übergeben.
Erinnerst du dich, was es bedeutet, um etwas von Wert zu übergeben?
Es bedeutet, wir machen eine Kopie der Variable, die in weitergegeben.
Die aufgerufene Funktion die Funktion daß angenommen, der das variable,
nicht die Variable selbst zu bekommen.
Es hat seinen eigenen lokalen Kopie davon, mit zu arbeiten.
>> Arrays, natürlich, zu tun dieser Regel nicht folgt.
Vielmehr, was wir nennen dies wird Übergabe als Referenz.
Der Angerufene tatsächlich hat empfangen das Array.
Sie empfängt ihre eigene lokale Kopie davon.
Und wenn Sie darüber nachdenken, es, ist dies sinnvoll.
Wenn Arrays sind wirklich groß, es nimmt so viel Zeit und Mühe
eine Kopie eines Arrays von machen 100 oder 1.000 oder 10.000 Elementen,
dass es nicht wert für ein Funktion, um eine Kopie davon zu erhalten,
einige Arbeit mit ihm, und dann nur mit der Kopie durchgeführt werden;
es muss nicht zu haben, sie hängen mehr da.
>> Da Arrays sind einige sperrig und umständlich,
wir gerade vorbeiziehen Referenz.
Wir vertrauen darauf, genau das zu Funktions zu, nicht alles zu brechen.
So dass es tatsächlich das Array.
Es wird nicht seine eigene lokale Kopie davon.
>> Also, was bedeutet das, Dann, wenn der Angerufene
manipuliert Elemente des Arrays?
Was ist passiert?
Denn jetzt werden wir beschönigen über warum genau dieses
der Fall ist, warum Arrays werden als Referenz übergeben
und alles andere wird als Wert übergeben.
Aber ich verspreche Ihnen, werden wir zurückzukehren und geben Ihnen die Antwort
Um dies in einer späteren Video.
>> Hier ist eine weitere Übung für Sie bevor wir einpacken Dinge auf Arrays.
Die Reihe von Code hier, das ist, nicht besonders guten Stil,
nur Ich werde diese Einschränkung zu machen.
Es gibt keine Kommentare hier, was ziemlich schlechte Form.
Aber es ist nur, weil ich sein wollte in der Lage, alles, was auf den Bildschirm passen.
>> An der Spitze, können Sie sehen, dass ich zwei Funktionsdeklarationen für Set-Array
und setzen int.
Set Array dauert offenbar ein Array von vier ganzen Zahlen als ihre Eingabe.
Und setzen int anscheinend dauert eine einzelne ganze Zahl als Eingabe.
Aber beide haben keine ausgegeben.
Die Ausgabe, die Rückkehr Typ, der jeder ist nichtig.
In Main, haben wir einen paar Zeilen Code.
Wir erklären, eine Integer-Variable genannt A und weisen Sie ihm den Wert 10.
Wir erklären, eine Reihe von vier Ganzzahlen genannt B und ordnen Sie die Elemente 0, 1,
2 und 3.
Dann, einen Anruf zu setzen müssen wir int und ein Aufruf zum Array festlegen.
Die Definitionen der Satz-Array und Set int sind da unten, am Boden.
>> Und so wieder, bitte ich Sie, die Frage.
Was wird ausgedruckt Hier am Ende der Main?
Es gibt einen Ausdruck col. Ich bin Ausdrucken von zwei ganzen Zahlen.
Ich Ausdrucken der Inhalte von A und der Inhalt des B eckige Klammer 0.
Halten Sie das Video hier und nehmen Sie eine Minute.
Kannst du herausfinden, was diese Funktion wird am Ende zu drucken?
Hoffentlich, wenn Sie sich erinnern, die Unterscheidung zwischen vorbei Wert
und Übergabe als Referenz, diese Problem war nicht allzu schwierig für Sie.
Und die Antwort würden Sie, haben festgestellt, ist diese.
Wenn Sie sich nicht, um wirklich sicher, , warum das der Fall ist, nehmen Sie einen zweiten,
gehen Sie zurück, zu überprüfen, was ich gerade war, Diskussion über die Weitergabe Arrays
durch Bezugnahme versus vorbei andere Variablen nach Wert,
und hoffentlich werden es machen ein wenig mehr Sinn.
>> Ich bin Doug Lloyd, und dies ist CS50.