Hallo und willkommen zurück.
Wir sind in einem neuen Bereich. Dieser Abschnitt heißt Zeiger.
Dies ist wahrscheinlich der wichtigste Abschnitt des Kurses.
Es ist wahrscheinlich auch der schwierigste Abschnitt des Kurses. Das Konzept von
Zeigern und c ist ein kniffliges, kniffliges Konzept.
Aber wir werden es sehr langsam durchgehen.
Wir werden viele Vorträge halten und Schritt für Schritt vorgehen.
Wir werden auf höchstem Niveau beginnen und immer detaillierter vorgehen.
Sie müssen Zeiger verstehen, wenn Sie die c-Sprache voll
ausnutzen möchten. Es ist also sehr wichtig.
Beginnen wir also oben und sprechen über dieses Konzept der Indirektion, das im
Wesentlichen das gleiche Konzept wie ein Zeiger ist.
Zeiger sind also dem Konzept der Indirektion sehr ähnlich.
Sie setzen Indirektion in Ihrem Alltag ein. Wenn ich zum Beispiel
beschreibe, was Indirektion bedeutet, wäre es so, als
müssten Sie etwas Neues kaufen, ein neues Produkt in Ihrem Unternehmen.
Angenommen, Sie mussten eine neue Tintenpatrone für Ihren Drucker kaufen.
Wenn Sie in einem großen Unternehmen arbeiten, müssen Sie
wahrscheinlich eine bestimmte Abteilung durchlaufen, um
neue Einkäufe zu tätigen. Sie würden also wahrscheinlich in die Einkaufsabteilung gehen.
Sie würden wahrscheinlich jemanden beim Kauf anrufen und
ihn bitten, die neue Patrone für Sie zu bestellen.
Es wäre ihre Aufgabe, dann ein lokales Geschäft zu
finden, das den tatsächlichen Artikel liefert, den Sie bestellen möchten.
Dies bedeutet, dass Sie diesen Artikel nicht direkt selbst bestellen.
Sie bitten jemanden, es für Sie zu tun.
Und dann erhalten sie es durch ihr Fachwissen und ihr
Wissen darüber, wer dieses Produkt im Inventar hat,
an Sie zurück.
Dies ist also eine Ebene der Indirektion, die Sie betrifft. Du gehst nicht weiter und gehst
einfach in den Laden und kaufst ihn. Sie gehen in die Einkaufsabteilung, die
Abteilung der Person hat das Wissen, dass sie alles für Sie erledigt.
Dies ist das gleiche Konzept eines Zeigers in der Programmierung.
In Programmiersprachen ist Indirektion die Fähigkeit, etwas mit einem Namen, einer Referenz
oder einem Container anstelle des Werts selbst zu referenzieren.
Wir verwenden eine Form der Interaktion, indem wir Variablennamen verwenden.
Wir verwenden die Speicheradresse nicht, um auf Daten zuzugreifen.
Wir verwenden einen Variablennamen.
Die häufigste Form der Indirektion ist das Manipulieren eines Werts
über seine Speicheradresse.
Zusätzlich zu einer wirklich kleinen
Beschreibung der Indirektion unter Verwendung eines Variablennamens zur Darstellung einer Speicheradresse können Sie
einen Wert auch anhand seiner Speicheradresse anhand der Adresse selbst bearbeiten.
die Adresse selbst.
Ein Zeiger bietet also eine indirekte Möglichkeit, auf den Wert eines bestimmten Datenelements zuzugreifen.
Es ist eine Variable, deren Wert eine Speicheradresse ist,
und dies ist wichtig zu verstehen.
Bis zu diesem Punkt haben wir Variablen gelernt, die bestimmte
Arten von Daten, Zahlen,
Zeichen, Doppelwerten und Gleitkommazahlen mit rationalen Zahlen enthalten.
Jetzt haben wir eine
Variable, die keinen dieser Datentypen speichert.
Die Art der Datenspeicher ist eine Speicheradresse.
Die Speicheradresse wird als Ganzzahl, als Hexadezimalzahl dargestellt, aber
es wird immer
noch eine Speicheradresse sein.
Es ist also der Wert einer
Adresse und eines anderen Speicherorts, wenn es sich um eine vorhandene Variable
oder einen neuen Speicherort handelt, den Sie dynamisch zuweisen.
So wie es Gründe gibt, warum es sinnvoll ist, die
Einkaufsabteilung zu durchlaufen, um neue Patronen zu
bestellen, müssen Sie beispielsweise nicht wissen, in welchem Geschäft die Patronen bestellt werden.
Es gibt auch gute Gründe, warum es sinnvoll ist, Zeiger
und c zu verwenden. Um diese Variablen zu verwenden, die eine Adresse darstellen, eine Speicheradresse.
Wir haben zu Beginn des Kurses über Speicheradressen gesprochen.
Und wie, wenn Sie ein Programm ausführen und Variablen erstellen, werden diese im Speicher gespeichert.
Und dieser Speicher hat eine bestimmte Adresse. Sie müssen die Adresse kennen, um diese
Daten zurückzubekommen, genauso wie Sie die Adresse eines Hauses kennen müssen, wenn Sie irgendwohin fahren, oder
die Adresse eines Ortes.
Die Verwendung von Zeigern in Ihrem Programm ist daher eines der leistungsstärksten Tools in der Sprache c.
Deshalb ist es wichtig zu verstehen.
Jedes Programm in c, das inhaltlich ist, verwendet Zeiger.
Man muss dieses Konzept also verstehen.
Und für Programmierer da draußen, die modernere Sprachen wie Java
oder Cis programmiert haben, müssen Sie sich darüber
keine Gedanken machen, da
die gesamte Speicherzuweisung und es kein wirkliches
Konzept für Zeiger gibt.
Obwohl unter der Haube,
verwendet Java Zeiger, weil sie Kopien von Referenzen haben.
Es ist das gleiche Konzept. In c haben Sie
jedoch explizit eine Variable, die eine Adresse darstellt.
Zeiger sind auch eines der verwirrendsten Konzepte der c-Sprache.
Sie neigen dazu, missbraucht
zu werden, sie werden nicht vollständig verstanden, insbesondere von neuen Programmierern.
Daher ist es wichtig, dass Sie dieses Konzept zu Beginn herausfinden
und eine klare Vorstellung davon haben, was passiert, wenn
Sie sich mit dem immer weiter fortgeschrittenen Konzept c und den immer weiter fortgeschrittenen Zeigern befassen.
Wenn Sie dies am Anfang nicht verstehen, lernen
Sie, studieren Sie, üben Sie das Schreiben von Code mit Zeigern.
Der Compiler muss den Datentyp kennen, der in der Variablen
gespeichert ist, auf die er verweist. Es ist also wie bei einer
regulären Variablen, und Sie müssen den Datentyp angeben, wenn Sie den Zeiger erstellen.
Der Grund, warum der Compiler dies wissen muss, ist der gleiche Grund für Variablen.
Er muss wissen, wie viele Daten zugewiesen werden müssen, selbst wenn Sie auf bestimmte Daten verweisen.
Jeder Zeiger wird einem bestimmten Variablentyp zugeordnet.
Es kann nur verwendet werden, um auf Variablen dieses Typs zu
verweisen. Wir werden ein Beispiel dafür geben, wenn wir über das Definieren eines Zeigers sprechen.
So können beispielsweise Zeiger vom
Typ Zeiger nur auf Variablen vom Typ int zeigen.
Wieder hat eine Variable den
Wert einer Adresse, das ist ein Zeiger.
Diese Adresse kann irgendwo im Speicher einen Wert enthalten.
Zeiger vom Typ float auf float können nur auf Variablen vom Typ float zeigen.
Hier ist eine veranschaulichende Idee,
die Ihnen das Konzept eines Zeigers gibt.
Mach dir hier keine Sorgen um die Syntax.
Wir haben es in früheren Vorlesungen kurz besprochen, dieses kaufmännische Und und dieses Sternchen, darüber müssen
Sie sich nicht unbedingt Gedanken machen. Ich möchte, dass Sie hier
darauf achten, wie ein Zeiger eine Adresse hat, und diese Adresse kann
einen Wert enthalten, sich aber an einer anderen Stelle im Speicher befinden.
In diesem Beispiel erstellen wir eine reguläre Zahl, wir haben
eine Million Mal erstellt. Dann sehen Sie diese Syntax mit dem Sternchen, das angibt, dass
es sich um einen Zeiger handelt. Wir werden das im Detail durchgehen.
Sie sehen auch das kaufmännische Und, das angibt, dass es sich um eine Adresse handelt.
Wenn wir in diesem Beispiel diesen Zeiger vom Typ int p number erstellen,
weisen wir eine Adresse zu. Denken Sie daran, dass Zeiger nur Adressen speichern können.
Und wie dies tatsächlich im Speicher angeordnet ist, ist,
dass Sie eine Variablennamennummer haben
und die Nummer einen Wert von 99 hat.
Nummer hat auch eine Adresse im Speicher.
Diese Adresse im Speicher ist der Wert des Zeigers.
P number ist also ein Zeiger, der auf die Adresse 1008 zeigt.
1008 hat einen Wert von 99 und enthält
auch die Variablennummer.
Das ist also wirklich das, worauf wir hinaus wollen. Wenn dies nicht klar ist, müssen Sie dies
eine Stunde lang betrachten und sicherstellen, dass Sie es verstehen.
Wieder ist der Punkt, dass ein Zeiger einen Wert auf eine Adresse
hat, das ist es, was er speichert.
Und dann können Sie mit einer bestimmten Syntax tatsächlich auf den Wert in dieser Adresse zugreifen.
Warum also Zeiger verwenden, warum dieses Konzept überhaupt ansprechen, warum können wir
nicht einfach vorhandene Datentypen verwenden,
die wir verwenden, und das Zeichenarray verwenden, wenn wir Zeichenfolgen verwenden möchten.
Der Zugriff auf Daten nur über Variablen ist sehr einschränkend.
Mit Zeigern können Sie auf jeden Ort zugreifen, Sie können beispielsweise jede
Position des Speichers als Variable behandeln und dann können Sie auch
mit Zeigern rechnen, was die Arbeit erleichtert.
Zeiger in c erleichtern die Verwendung von Arrays und Strings,
und wir werden auch darauf eingehen. Dies ist ein weiterer Vorteil bei der Verwendung von Zeigern.
Mit Zeigern können Sie auf denselben Speicherplatz und Speicher mit mehreren Speicherorten verweisen.
Dies bedeutet also, dass Sie den Speicher an einem Ort
aktualisieren können und die Änderung dann an einem anderen Ort in Ihrem Programm angezeigt werden kann.
Es ist eine Art, globale Daten zu verwenden, aber immer noch in Funktionen eingekapselt zu sein.
Sie können auch viel Speicherplatz sparen, indem Sie Komponenten in Ihren Datenstrukturen
gemeinsam nutzen können.
Denken Sie also daran, als c erfunden wurde, wurde c in den 70er Jahren erfunden.
Die Idee von c war, sehr effizient und auf niedrigem Niveau zu sein.
Die Idee, direkt über Zeiger auf den Speicher zuzugreifen, ist
sehr effizient
und auch sehr schnell.
Mit Zeigern können Funktionen auch Daten ändern, die als Variablen an
sie übergeben werden. Dies wird als Referenz übergeben. Wir werden einen Vortrag darüber halten.
Hier können Sie mit Ihren Zeigern Argumente an eine Funktion übergeben.
Wenn Sie diese Daten innerhalb der Funktion ändern,
wird die Änderung außerhalb dieser Funktion wiedergegeben.
Wir müssen also keine globalen Daten mehr verwenden.
Wir können Daten innerhalb einer Funktion verwenden, diese Daten
als Zeiger übergeben und dann die Daten außerhalb
dieser Funktion zuweisen. Es hat also nicht den Nachteil,
globale Variablen zu verwenden, bei denen alles eng miteinander verbunden ist.
Sie können dies auf die Daten beschränken, die nur die Funktionen benötigen, die diese Daten kennen müssen.
Wie bereits erwähnt, kann es auch verwendet werden, um das Programm so zu
optimieren, dass es schneller ausgeführt wird und
weniger Speicher benötigt als sonst.
Dies ist ein wichtiges Konzept, insbesondere bei eingebetteten Echtzeitprogrammen.
Zeiger ermöglichen es uns auch, mehrere Werte von einer Funktion abzurufen.
Wir haben über Funktionen gesprochen, wie Sie Datenfunktionen übergeben können.
Wir haben auch darüber gesprochen, wie Sie Daten zurückgeben können.
Wir wissen, dass Sie derzeit nur einen Wert von einer Funktion zurückgeben können.
Wenn Sie jedoch Zeiger verwenden, können Sie tatsächlich mehrere Werte von einer Funktion zurückgeben.
Und darüber werden wir reden. Das ist ein großer Vorteil.
Wir werden auch über die dynamische Speicherzuweisung sprechen.
Wenn wir gerade Speicher für ein Programm erstellen, wird dies
implizit vom Compiler ausgeführt, wenn Sie eine Variable deklarieren.
Wenn Sie eine int-Variable deklarieren, werden beispielsweise automatisch 4 Bytes für diese Variable erstellt.
Wenn Sie Arrays verwenden und die Größe eines
Arrays angeben, wird diese Größe zur Kompilierungszeit zugewiesen.
Wenn Sie also versuchen, mehr Daten als diese zu speichern, sind Sie fertig,
Ihr Programm wird nicht funktionieren.
Aber wenn Sie die Möglichkeit hätten, zur
Laufzeit tatsächlich so viel Speicher zu erstellen, wie Sie benötigen,
wäre das enorm. Und Zeiger ermöglichen es Ihnen, dies zu tun.
Mit ihnen können Sie zur Laufzeit eine dynamische Speicherzuordnung erstellen.
Wir werden auch darüber reden.
Zeiger ermöglichen es uns, komplexere Datenstrukturen zu entwerfen und zu entwickeln.
Und Datenstruktur ist etwas, das Daten speichert.
Beispiele für Datenstrukturen sind das Stapeln eines Cues oder einer verknüpften Liste.
Und wir können diese viel einfacher mit Zeigern erstellen.
Zeiger bieten direkten Speicherzugriff, wiederum effizient und schnell.
Zeiger werden also ein großes Konzept sein. Wir werden viele Vorträge über Zeiger halten.
Ich möchte, dass ihr euch konzentriert, und ich möchte, dass ihr aufpasst, wenn ich über all
diese Konzepte spreche, weil es wichtig und wichtig ist, die Programmiersprache c zu verstehen.
Also viel Glück und fangen wir an. Vielen Dank.