struct (Programmiersprache C) - struct (C programming language)

Eine Struktur in der Programmiersprache C (und vielen Ableitungen) ist eine zusammengesetzte Datentyp- (oder Datensatz- ) Deklaration, die eine physikalisch gruppierte Liste von Variablen unter einem Namen in einem Speicherblock definiert, sodass über einen einzelnen Zeiger auf die verschiedenen Variablen zugegriffen werden kann oder durch den deklarierten Strukturnamen, der dieselbe Adresse zurückgibt. Der Strukturdatentyp kann andere Datentypen enthalten und wird daher für Datensätze mit gemischtem Datentyp verwendet, z. B. für einen Festplattenverzeichniseintrag (Dateilänge, Name, Erweiterung, physikalische Adresse usw.) oder für andere Datensätze mit gemischtem Typ (Name) , Adresse, Telefon, Guthaben usw.).

Die C-Struktur verweist direkt auf einen zusammenhängenden Block des physischen Speichers, der normalerweise durch Wortlängengrenzen begrenzt (Größe) ist. Es entspricht der ähnlich benannten Funktion, die in einigen Assemblern für Intel-Prozessoren verfügbar ist . Da es sich um einen zusammenhängenden Speicherblock handelt, befindet sich jedes Feld innerhalb einer Struktur von Anfang an an einem bestimmten festen Versatz.

Da der Inhalt einer Struktur in einem zusammenhängenden Speicher gespeichert ist, muss der Operator sizeof verwendet werden, um die Anzahl der Bytes abzurufen, die zum Speichern eines bestimmten Strukturtyps erforderlich sind, genau wie er für Grundelemente verwendet werden kann . Die Ausrichtung bestimmter Felder in der Struktur (in Bezug auf Wortgrenzen ) ist implementierungsspezifisch und kann das Auffüllen umfassen, obwohl moderne Compiler normalerweise die #pragma pack Direktive unterstützen, die die Größe der für die Ausrichtung verwendeten Bytes ändert.

In der C ++ - Sprache ist eine Struktur mit einer C ++ - Klasse identisch, hat jedoch eine andere Standardsichtbarkeit: Klassenmitglieder sind standardmäßig privat, während Strukturmitglieder standardmäßig öffentlich sind.

In anderen Sprachen

Der Strukturdatentyp in C wurde vom Strukturdatentyp ALGOL 68 abgeleitet .

Wie sein C-Gegenstück ähnelt der Strukturdatentyp in C # ( Struktur in Visual Basic .NET ) einer Klasse . Der größte Unterschied zwischen einer Struktur und einer Klasse in diesen Sprachen besteht darin, dass bei der Übergabe einer Struktur als Argument an eine Funktion Änderungen an der Struktur in dieser Funktion nicht in der ursprünglichen Variablen berücksichtigt werden (es sei denn, es handelt sich um eine Referenzübergabe) benutzt).

Dies unterscheidet sich von C ++, wo Klassen oder Strukturen statisch oder dynamisch entweder auf dem Stapel (ähnlich wie C #) oder auf dem Heap mit einem expliziten Zeiger zugewiesen werden können. In C ++ besteht der einzige Unterschied zwischen einer Struktur und einer Klasse darin, dass die Mitglieder und Basisklassen einer Struktur standardmäßig öffentlich sind . (Eine mit dem class Schlüsselwort definierte Klasse hat standardmäßig private Mitglieder und Basisklassen.)

Erklärung

Die allgemeine Syntax für eine Strukturdeklaration in C lautet:

struct tag_name {
   type member1;
   type member2;
   /* declare as many members as desired, but the entire structure size must be known to the compiler. */
};

Hier tag_name ist in einigen Kontexten optional.

Eine solche struct Deklaration kann auch im Kontext einer typedef- Deklaration eines Typalias oder der Deklaration oder Definition einer Variablen erscheinen:

typedef struct tag_name {
   type member1;
   type member2;
} struct_alias;

Initialisierung

Es gibt drei Möglichkeiten, eine Struktur zu initialisieren. Für den struct Typ

/* Declare the struct with integer members x, y */
struct point {
   int    x;
   int    y;
};

Initialisierer im C89-Stil werden verwendet, wenn zusammenhängende Elemente angegeben werden können.

/* Define a variable p of type point, and initialize its first two members in place */
struct point p = { 1, 2 };

Für nicht zusammenhängende oder nicht in der Reihenfolge befindliche Mitgliederlisten kann ein bestimmter Initialisierungsstil verwendet werden

/* Define a variable p of type point, and set members using designated initializers*/
struct point p = { .y = 2, .x = 1 };

Wenn ein Initialisierer angegeben ist oder wenn das Objekt statisch zugeordnet ist , werden ausgelassene Elemente auf 0 initialisiert.

Eine dritte Möglichkeit zum Initialisieren einer Struktur besteht darin, den Wert eines vorhandenen Objekts desselben Typs zu kopieren

/* Define a variable q of type point, and set members to the same values as those of p */
struct point q = p;

Zuordnung

Eine Struktur kann einer anderen Struktur zugewiesen werden. Ein Compiler kann memcpy() eine solche Zuweisung verwenden.

struct point {
    int x;
    int y;
};

int main(void)
{
    struct point p = { 1, 3 };        /* initialized variable */
    struct point q;                   /* uninitialized */
    q = p;                     /* copy member values from p into q */
    return 0;
}

Zeiger auf Struktur

Zeiger können verwendet werden, um auf a struct anhand seiner Adresse zu verweisen . Dies ist nützlich, um Strukturen an eine Funktion zu übergeben. Der Zeiger kann mit dem Operator dereferenziert werden * . Der -> Operator dereferenziert den Zeiger auf struct (linker Operand) und greift dann auf den Wert eines Mitglieds der struct (rechter Operand) zu.

struct point {
   int x;
   int y;
};
struct point my_point = { 3, 7 };
struct point *p = &my_point;  /* p is a pointer to my_point */
(*p).x = 8;                   /* set the first member of the struct */
p->x = 8;                     /* equivalent method to set the first member of the struct */

Siehe auch

Verweise