Einführung
- 4415
- 297
- Miriam Bauschke
Wir werden in diesem Teil unseres Tutorials mit den komplexen Datentypen in C fortgesetzt, und wir werden über Strukturen sprechen. Viele moderne Programmiersprachen bieten ihnen, die eine oder andere Form, und C auch C. Wie Sie später sehen werden, ermöglichen Sie Strukturen, Daten leichter zu manipulieren, indem Sie verschiedene Variablen von (möglicherweise) unterschiedlichen Typen unter einem einzigen „Dach“ speichern, um zu speichern.
Strukturen beginnen
Obwohl ich den Definitionsteil für diesen Unterkapitel verschieben wollte, scheint ich es zu erwarten und in die Einführung aufzunehmen. Ja, Leute, das ist eine Struktur, und Sie werden aus einer Laune heraus sehen, wie nützlich es ist, wenn ich Ihnen einige Beispiele zeigen werde. Eine interessante Parallele ist diejenige, die sich auf eine Datenbanktabelle bezieht: Wenn Sie eine Tabelle namens Benutzer haben (den eindeutigen Namen), geben Sie die genauen Daten, die sich direkt an die Benutzer beziehen, in diese Tabelle ein. usw. Aber das sind verschiedene Typen! Kein Problem, Sie können dies mit einer Tabelle tun, genauso wie Sie es mit einer Struktur tun können: Alter wird eine Ganzzahl sein, Geschlecht wird ein Zeichen, der Name ist eine Zeichenfolge und so weiter. Dann können Sie auf die zugreifen Mitglieder der Tabelle leicht, indem Sie sich auf den Namen der Tabelle/des Mitglieds beziehen. Dies ist jedoch kein Datenbankkurs. Lassen Sie uns also weitermachen. Lassen Sie uns vorher einen kurzen Blick auf einen logischen Aspekt werfen: Sie sind eingeladen, Strukturen mit Mitgliedern zu erstellen, die etwas aus logischer Sicht gemeinsam haben, wie das Beispiel oben. Machen Sie es Ihnen und den Personen, die später Ihren Code später betrachten, leichter. Lassen Sie uns also sehen, wie unsere Benutzerdatenbanktabelle in einer C -Struktur übersetzt werden:
Struktur Benutzer int ay; Char -Geschlecht; Char *Name; char *Adresse; ;
Bitte vergessen Sie das Semikolon am Ende nicht. Ok, also rühmte ich mich, dass die Mitglieder der Struktur einfach zugänglich sind. So, sofern Sie auf das Alter des Benutzers zugreifen möchten:
printf ("Das Alter des Benutzers ist %d.\ n ", Benutzer.Alter);
Damit dieser Printf funktioniert, müssen wir zuerst das Alter definieren. Das kann so gemacht werden
Struktur Benutzer int age;… usrs; USRS.Alter = 25;…
Was wir hier getan haben, ist ein Deklary a Beispiel von der Struktur (Sie können so viele Fälle wie Sie haben), mit dem Namen "usrs" namens "usrs". Sie können usrs1, usrs2, usrs3 usw. haben, damit Sie diese Attribute (wie Alter, Geschlecht, Adresse) für alle verwenden können. Der zweite Weg, dies zu tun, besteht darin, die Struktur wie beim ersten Mal zu erklären (e.G. ohne Instanzen) und dann die jeweiligen Fälle später im Code deklarieren:
… Struktur Benutzer usrs1, usrs2, usrs3;
… Und kümmern Sie sich dann um Alter, Geschlecht, Adresse und so weiter wie oben.
Wenn wir in Verbindung mit Funktionen über Strukturen sprechen, ist das Wichtigste, über das wir sprechen sollten. Hier ist ein Beispiel:
void show_age (usrs i) printf ("Benutzer des Benutzers ist %d.\ n ", ich.Alter); printf ("Benutzername ist %s.\ n ", (& i)-> Name);
Was diese Funktion tut, ist: Sie benötigt ein numerisches Argument und druckt alle Benutzer aus, die dieses bestimmte Alter haben. Möglicherweise haben Sie im obigen Code einen neuen Bediener bemerkt (wenn Sie nicht nicht sehen, schauen Sie erneut). Der "->" -Preiber macht genau das, was der Punktbetreiber tut, sodass Sie auf ein Mitglied der Struktur zugreifen können, mit der Spezifikation, dass er verwendet wird, wenn Zeiger beteiligt sind. Eine weitere wichtige Überlegung hier. Angesichts des folgenden Code:
Struktur Mystruct int myint; char *mystring; *P;
Was wird Ihrer Meinung nach der folgende Ausdruck tun??
++p-> myint;
Erweiterte Themen
Eines der Dinge, die Sie in Bezug auf Strukturen ziemlich oft sehen werden, ist jedoch nicht nur das Typedef Stichwort. Wie der Name schon sagt, können Sie benutzerdefinierte Datentypen definieren, wie in den folgenden Beispielen:
Typedef int Länge; / * Jetzt ist die Länge ein Synonym für int */ Typedef char * string;
In Bezug auf Strukturen eliminiert typedef im Grund. Hier ist eine auf diese Weise deklarierte Struktur:
Typedef Struktur Kollegen int age; Zeichen Geschlecht;… Colls;
Für unser nächstes Thema werden wir eine in K & R gefundene Idee nehmen und sie verwenden, um unseren Standpunkt zu veranschaulichen. Warum? Es ist gut durchdacht und es zeigt sich sehr gut und auf einfache Weise, was wir veranschaulichen,. Aber bevor wir beginnen, hier ist eine Frage für Sie: Wenn Sie wissen, dass C verschachtelte Strukturen erlaubt, können verschachtelte Strukturen mittels Typedef akzeptiert werden? Warum?
Also, hier ist das nächste Thema: Struct -Arrays. Jetzt, wo Sie wissen, welche Arrays sind, können Sie leicht erraten, worum es geht. Es bleiben jedoch einige Fragen vorhanden: wie das Konzept und, was noch wichtiger ist, die Verwendung sein könnte? Das Beispiel, über das wir gesprochen haben, wird bald etwas Licht auf beide Angelegenheiten werfen. Nehmen wir an, Sie haben ein in C geschriebenes Programm und möchten die Anzahl der Vorkommen aller Schlüsselwörter, die der Standard definiert. Wir benötigen zwei Arrays: einen, um die Schlüsselwörter zu speichern, und einen anderen, um die Anzahl der Ereignisse zu speichern, die jedem Schlüsselwort entsprechen. Diese Implementierung kann als solche geschrieben werden:
char *keywords [nrkeywords]; int Ergebnisse [nrkeywords];
Wenn Sie sich das Konzept ansehen, werden Sie bald sehen, dass es ein Paar Konzept verwendet, das effizienter mit einer Struktur beschrieben wird. Aufgrund des Endergebnisses werden wir also ein Array haben, dessen jedes Element eine Struktur ist. Mal sehen.
Struktur Schlüsselwort char *Schlüsselwörter; int Ergebnisse; keywrdtbl [nrkeywords];
Lassen Sie uns nun das Array mit den Schlüsselwörtern und der anfänglichen Anzahl der Vorkommen initialisieren, die natürlich 0 sein werden.
Struktur Schlüsselwort char *Schlüsselwörter; int Ergebnisse; keywrdtbl [] = "auto", 0, "break", 0, "case", 0, ... "while", 0;
Ihr nächster und letzter Auftrag, da diese Aufgabe etwas komplexer ist.
Das letzte Thema zu Strukturen, mit denen ich mich befassen werde, ist die Frage der Zeiger auf Strukturen. Wenn Sie das Programm in der letzten Übung geschrieben haben, haben Sie möglicherweise bereits eine gute Vorstellung davon, wie es neu geschrieben werden könnte, damit es stattdessen Zeiger verwenden kann. Wenn Sie also gerne Code schreiben, können Sie dies als optionale Übung betrachten. Es gibt also nicht viel hier, nur ein paar Aspekte, wie (sehr wichtig), Sie müssen einen zusätzlichen Code mit zusätzlicher Sorgfalt einführen, damit Sie beim Parsen des Quellcodes der Datei nach Schlüsselwörtern und natürlich nach der Suchfunktion scannen, und natürlich die Suchfunktion Muss geändert werden, Sie werden einen illegalen Zeiger nicht erstellen oder stolpern. Siehe den vorherigen Teil als Referenz auf Zeiger -Arithmetik und Unterschiede zwischen der Verwendung von Arrays und Zeigern. Ein weiteres Problem, mit dem Sie vorsichtig sind, ist die Größe der Strukturen. Lassen Sie sich nicht täuschen: Es kann nur einen Weg geben, um den Weg einer Struktur richtig zu machen, und das ist, indem Sie sizeof () verwenden.
#enthalten Struktur testen int eins; int zwei; char *str; float flt; ; int main () printf ("Strukturgröße ist %d ist.\N", Größe von(Struktur prüfen)); zurückkehren 0;
Dies sollte 24 zurückkehren, aber das ist nicht garantiert, und K & R erklärt, dass dies an verschiedenen Ausrichtungsanforderungen zurückzuführen ist. Ich empfehle die Verwendung von Sizeof, wann immer Sie Zweifel haben, und nehmen Sie nichts an.
Gewerkschaften
Ich hätte den Titel ändern und das Wort "Gewerkschaften" und vielleicht sogar "Bitfields" einschließen sollen. Aufgrund der Bedeutung und des allgemeinen Verwendungsmusters von Strukturen gegenüber Gewerkschaften und Bitfields, insbesondere jetzt, dass Hardware zu einem billigeren Gut (nicht unbedingt gesundes Denken, aber trotzdem) wird, wird der Titel nur „Strukturen“ sagen. Also, was ist eine Gewerkschaft?? Eine Gewerkschaft ähnelt sehr einer Struktur, was unterscheidet, wie der Compiler mit dem Speicher (Speicher) dafür umgeht. Kurz gesagt, eine Gewerkschaft ist ein komplexer Datentyp, der verschiedene Arten von Daten speichern kann, aber jedoch jeweils ein Mitglied. Unabhängig davon, wie groß die gespeicherte Variable sein wird, wird sie in diesem genauen Moment ihren Platz haben, aber andere werden in der Gewerkschaft nicht erlaubt sein. Daher der Name "Gewerkschaft". Die Erklärungen und Definitionen von Gewerkschaften sind die gleichen wie Strukturen, und es ist garantiert, dass die Gewerkschaft genauso viel Erinnerung annimmt wie ihr größtes Mitglied.
Bitfields
Wenn Sie C in Embedded Systems-Programmierung und/oder Low-Level-Sachen Ihr Spiel verwenden möchten, scheint dieses Teil ansprechend erscheinen. Ein Bitfield (einige schreiben es Bit -Feld), hat kein Schlüsselwort wie Enum oder Union zugewiesen und erfordert, dass Sie Ihre Maschine kennen. Es ermöglicht Ihnen, über die typischen wortbasierten Einschränkungen hinauszugehen, auf die andere Sprachen Sie beschränken. Es ermöglicht es Ihnen auch, und dies könnte eine formale Definition sein: „Pack“ mehr als ein Objekt in einem einzelnen Wort.
Aufschwung
Um mit einer kurzen historischen Tatsache zu beginnen, wurden Enums in C eingeführt, als C89 vor der Tür war, was bedeutet, dass K & R diesen raffinierten Typ fehlte. Mit einem Auflauf können der Programmierer eine Reihe benannter Werte erstellen, die auch als Enzerratoren bezeichnet werden und die als Hauptmerkmale, dass er einen mit ihm verbundenen Ganzzahlwert hat, entweder implizit (0,1,2…) oder explizit vom Programmierer (Programmer 1,2,4,8,16…) . Dies erleichtert es leicht, magische Zahlen zu vermeiden.
Aufreum Druck Pres_low, Pres_Medium, Pres_High; Aufreum Druck p = pres_high;
Das ist einfacher, wenn wir Pres_low benötigen, um 0, mittel 1 usw. zu sein, und Sie müssen dafür keine #Defines verwenden. Ich empfehle ein bisschen Lesen, wenn Sie interessiert sind.
Abschluss
Obwohl die Informationen etwas kondensierter erscheinen als zuvor, mach dir keine Sorgen. Die Konzepte sind relativ leicht zu erfassen, und ein bisschen Bewegung wird Wunder wirken. Wir warten in unseren Linux -Foren auf Sie, um weitere Diskussionen zu erhalten.
Alle Artikel in dieser Serie:
- ICH. C Entwicklung unter Linux - Einführung
- Ii. Vergleich zwischen C und anderen Programmiersprachen
- III. Typen, Operatoren, Variablen
- Iv. Ablaufsteuerung
- V. Funktionen
- Vi. Zeiger und Arrays
- Vii. Strukturen
- Viii. Grundlegende I/O
- Ix. Codierungsstil und Empfehlungen
- X. Ein Programm erstellen
- Xi. Verpackung für Debian und Fedora
- Xii. Ein Paket in den offiziellen Debian -Repositories erhalten
Verwandte Linux -Tutorials:
- Dinge zu installieren auf Ubuntu 20.04
- Eine Einführung in Linux -Automatisierung, Tools und Techniken
- Dinge zu tun nach der Installation Ubuntu 20.04 fokale Fossa Linux
- Ubuntu 20.04 Tricks und Dinge, die Sie vielleicht nicht wissen
- Mastering -Bash -Skriptschleifen beherrschen
- Verschachtelte Schleifen in Bash -Skripten
- Dinge zu installieren auf Ubuntu 22.04
- Mint 20: Besser als Ubuntu und Microsoft Windows?
- Wie man Kali Linux und Windows 10 Dual -Boot -Start hat
- Big Data Manipulation zum Spaß und Gewinn Teil 1