Struktura v C je uživatelsky definovaný datový typ, který lze použít k seskupení položek možná různých typů do jednoho typu. The klíčové slovo struct se používá k definování struktury v programovacím jazyce C. Položky ve struktuře se nazývají jeho člen a mohou mít jakýkoli platný datový typ.
C Prohlášení o struktuře
Před použitím v našem programu musíme strukturu deklarovat v C. V deklaraci struktury specifikujeme její členské proměnné spolu s jejich datovým typem. Klíčové slovo struct můžeme použít k deklaraci struktury v C pomocí následující syntaxe:
Syntax
struct structure_name { data_type member_name1; data_type member_name1; .... .... };> Výše uvedená syntaxe se také nazývá šablona struktury nebo prototyp struktury a v deklaraci není struktuře přidělena žádná paměť.
C Definice struktury
Abychom mohli použít strukturu v našem programu, musíme definovat její instanci. Můžeme to udělat vytvořením proměnných typu struktura. Strukturní proměnné můžeme definovat dvěma způsoby:
1. Prohlášení o proměnných struktury se šablonou struktury
struct structure_name { data_type member_name1; data_type member_name1; .... .... } variable1, varaible2, ... ;> 2. Deklarace proměnných struktury po šabloně struktury
// structure declared beforehand struct structure_name variable1, variable2 , .......;>
Členové přístupové struktury
Ke členům struktury můžeme přistupovat pomocí ( . ) tečkový operátor.
Syntax
structure_name.member1; strcuture_name.member2;>
V případě, že máme ukazatel na strukturu, můžeme pro přístup k členům použít i operátor šipky.
Inicializujte členy struktury
Členové struktury nemůže být inicializováno deklarací. Například následující program C selže při kompilaci.
struct Point { int x = 0; // COMPILER ERROR: cannot initialize members here int y = 0; // COMPILER ERROR: cannot initialize members here };> Důvod výše uvedené chyby je jednoduchý. Když je datový typ deklarován, není pro něj přidělena žádná paměť. Paměť je alokována pouze při vytváření proměnných.
Členy struktury můžeme inicializovat 3 způsoby, které jsou následující:
- Použití operátora přiřazení.
- Použití seznamu inicializátorů.
- Použití seznamu určených inicializátorů.
1. Inicializace pomocí operátora přiřazení
struct structure_name str; str.member1 = value1; str.member2 = value2; str.member3 = value3; . . .>
2. Inicializace pomocí seznamu inicializátorů
struct structure_name str = { value1, value2, value3 };> V tomto typu inicializace jsou hodnoty přiřazeny v sekvenčním pořadí, jak jsou deklarovány v šabloně struktury.
3. Inicializace pomocí seznamu určených inicializátorů
Určená inicializace umožňuje členům struktury inicializovat v libovolném pořadí. Tato funkce byla přidána do standardu C99.
struct structure_name str = { .member1 = value1, .member2 = value2, .member3 = value3 };> Určená inicializace je podporována pouze v C, ale ne v C++.
Příklad struktury v C
Následující program C ukazuje, jak používat struktury
C
přejmenování adresáře v linuxu
// C program to illustrate the use of structures> #include> > // declaring structure with name str1> struct> str1 {> >int> i;> >char> c;> >float> f;> >char> s[30];> };> > // declaring structure with name str2> struct> str2 {> >int> ii;> >char> cc;> >float> ff;> } var;>// variable declaration with structure template> > // Driver code> int> main()> {> >// variable declaration after structure template> >// initialization with initializer list and designated> >// initializer list> >struct> str1 var1 = { 1,>'A'>, 1.00,>'techcodeview.com'> },> >var2;> >struct> str2 var3 = { .ff = 5.00, .ii = 5, .cc =>'a'> };> > >// copying structure using assignment operator> >var2 = var1;> > >printf>(>'Struct 1:
i = %d, c = %c, f = %f, s = %s
'>,> >var1.i, var1.c, var1.f, var1.s);> >printf>(>'Struct 2:
i = %d, c = %c, f = %f, s = %s
'>,> >var2.i, var2.c, var2.f, var2.s);> >printf>(>'Struct 3
i = %d, c = %c, f = %f
'>, var3.ii,> >var3.cc, var3.ff);> > >return> 0;> }> |
>
>Výstup
Struct 1: i = 1, c = A, f = 1.000000, s = techcodeview.com Struct 2: i = 1, c = A, f = 1.000000, s = techcodeview.com Struct 3 i = 5, c = a, f = 5.000000>
typedef pro struktury
The typedef klíčové slovo se používá k definování aliasu pro již existující datový typ. Ve strukturách musíme k definování proměnných použít klíčové slovo struct spolu s názvem struktury. Někdy to zvyšuje délku a složitost kódu. Můžeme použít typedef k definování nějakého nového kratšího názvu struktury.
Příklad
C
// C Program to illustrate the use of typedef with> // structures> #include> > // defining structure> struct> str1 {> >int> a;> };> > // defining new name for str1> typedef> struct> str1 str1;> > // another way of using typedef with structures> typedef> struct> str2 {> >int> x;> } str2;> > int> main()> {> >// creating structure variables using new names> >str1 var1 = { 20 };> >str2 var2 = { 314 };> > >printf>(>'var1.a = %d
'>, var1.a);> >printf>(>'var2.x = %d'>, var2.x);> > >return> 0;> }> |
>
>Výstup
var1.a = 20 var2.x = 314>
Vnořené struktury
Jazyk C nám umožňuje vložit jednu strukturu do druhé jako člen. Tento proces se nazývá vnoření a takové struktury se nazývají vnořené struktury. Existují dva způsoby, jak můžeme vnořit jednu strukturu do druhé:
1. Vnoření vestavěné struktury
V této metodě je vnořená struktura také deklarována uvnitř nadřazené struktury.
přidávání řetězců java
Příklad
struct parent { int member1; struct member_str member2 { int member_str1; char member_str2; ... } ... }> 2. Samostatné vnoření struktury
V této metodě jsou dvě struktury deklarovány samostatně a poté je členská struktura vnořena do nadřazené struktury.
Příklad
struct member_str { int member_str1; char member_str2; ... } struct parent { int member1; struct member_str member2; ... }> Jedna věc, kterou je třeba poznamenat, je, že deklarace struktury by měla být vždy přítomna před její definicí jako člen struktury. Například, níže uvedené prohlášení je neplatné protože struct mem není definována, když je deklarována uvnitř nadřazené struktury.
struct parent { struct mem a; }; struct mem { int var; };> Přístup k vnořeným členům
K vnořeným členům můžeme přistupovat pomocí stejného operátoru tečky (.) dvakrát, jak je znázorněno:
str_parent.str_child .member;>
Příklad vnoření struktury
C
// C Program to illustrate structure nesting along with> // forward declaration> #include> > // child structure declaration> struct> child {> >int> x;> >char> c;> };> > // parent structure declaration> struct> parent {> >int> a;> >struct> child b;> };> > // driver code> int> main()> {> >struct> parent var1 = { 25, 195,>'A'> };> > >// accessing and printing nested members> >printf>(>'var1.a = %d
'>, var1.a);> >printf>(>'var1.b.x = %d
'>, var1.b.x);> >printf>(>'var1.b.c = %c'>, var1.b.c);> > >return> 0;> }> |
>
>Výstup
var1.a = 25 var1.b.x = 195 var1.b.c = A>
Ukazatel struktury v C
Můžeme definovat ukazatel, který ukazuje na strukturu jako kterákoli jiná proměnná. Takovým ukazatelům se obecně říká Ukazatele struktury . Ke členům struktury, na které ukazuje ukazatel struktury, můžeme přistupovat pomocí ( -> ) šipkový operátor.
Příklad Structure Ukazatele
C
// C program to illustrate the structure pointer> #include> > // structure declaration> struct> Point {> >int> x, y;> };> > int> main()> {> >struct> Point str = { 1, 2 };> > >// p2 is a pointer to structure p1> >struct> Point* ptr = &str;> > >// Accessing structure members using structure pointer> >printf>(>'%d %d'>, ptr->x, ptr->y);> > >return> 0;> }> |
>
>Výstup
java string concat
1 2>
Self-referenční struktury
Autoreferenční struktury v C jsou ty struktury, které obsahují odkazy na stejný typ jako samy sebe, tj. obsahují člen typu ukazatel ukazující na stejný typ struktury.
Příklad sebereferenčních struktur
struct structure_name { data_type member1; data_type member2; struct structure_name* str; }> C
// C program to illustrate the self referential structures> #include> > // structure template> typedef> struct> str {> >int> mem1;> >int> mem2;> >struct> str* next;> }str;> > // driver code> int> main()> {> >str var1 = { 1, 2, NULL };> >str var2 = { 10, 20, NULL };> > >// assigning the address of var2 to var1.next> >var1.next = &var2;> > >// pointer to var1> >str *ptr1 = &var1;> > >// accessing var2 members using var1> >printf>(>'var2.mem1: %d
var2.mem2: %d'>, ptr1->další->mem1,> >ptr1->další->mem2);> > >return> 0;> }> |
>
>Výstup
var2.mem1: 10 var2.mem2: 20>
Takové druhy struktur se používají v různých datových strukturách, jako je definování uzlů propojených seznamů, stromů atd.
C Structure Polstrování a balení
Technicky by velikost konstrukce v C měla být součtem velikostí jejích prvků. Ale ve většině případů to nemusí být pravda. Důvodem je Structure Padding.
Strukturní polstrování je koncept přidání více prázdných bajtů do struktury pro přirozené zarovnání datových členů v paměti. To se provádí za účelem minimalizace cyklů čtení CPU pro načtení různých datových členů ve struktuře.
Existují některé situace, kdy potřebujeme strukturu pevně zabalit odstraněním prázdných bajtů. V takových případech používáme Balení struktury. Jazyk C poskytuje dva způsoby balení struktury:
- Použití #pragma pack(1)
- Použití __attribute((sbaleno))__
Příklad vycpávky a balení struktury
C
příklad uživatelského jména
// C program to illustrate structure padding and packing> #include> > // structure with padding> struct> str1 {> >char> c;> >int> i;> };> > struct> str2 {> >char> c;> >int> i;> } __attribute((packed)) __;>// using structure packing> > // driver code> int> main()> {> > >printf>(>'Size of str1: %d
'>,>sizeof>(>struct> str1));> >printf>(>'Size of str2: %d
'>,>sizeof>(>struct> str2));> >return> 0;> }> |
>
>Výstup
Size of str1: 8 Size of str2: 5>
Jak můžeme vidět, velikost struktury se mění, když se provádí balení struktury.
Chcete-li se dozvědět více o vyplnění a sbalení struktury, přečtěte si tento článek – Bitová pole se používají k určení délky členů struktury v bitech. Když známe maximální délku členu, můžeme pomocí bitových polí určit velikost a snížit spotřebu paměti.
Syntaxe bitových polí
struct structure_name { data_type member_name : width_of_bit-field; };> Příklad bitových polí
C
// C Program to illustrate bit fields in structures> #include> > // declaring structure for reference> struct> str1 {> >int> a;> >char> c;> };> > // structure with bit fields> struct> str2 {> >int> a : 24;>// size of 'a' is 3 bytes = 24 bits> >char> c;> };> > // driver code> int> main()> {> >printf>(>'Size of Str1: %d
Size of Str2: %d'>,> >sizeof>(>struct> str1),>sizeof>(>struct> str2));> >return> 0;> }> |
>
>Výstup
Size of Str1: 8 Size of Str2: 4>
Jak vidíme, velikost struktury se zmenšuje při použití bitového pole k definování maximální velikosti členu „a“.
Použití struktury v C
C struktury se používají pro následující:
- Strukturu lze použít k definování vlastních datových typů, které lze použít k vytvoření některých komplexních datových typů, jako jsou data, čas, komplexní čísla atd., které nejsou v jazyce přítomny.
- Může být také použit v organizaci dat, kde lze uložit velké množství dat v různých polích.
- Struktury se používají k vytváření datových struktur, jako jsou stromy, propojené seznamy atd.
- Mohou být také použity pro vrácení více hodnot z funkce.
Omezení C struktur
V jazyce C poskytují struktury metodu pro sbalení dat různých typů. Struktura je užitečný nástroj pro práci se skupinou logicky souvisejících datových položek. Struktury C však mají také určitá omezení.
- Vyšší spotřeba paměti: Je to způsobeno výplní struktury. Žádné skrývání dat: Struktury C neumožňují skrývání dat. Ke členům struktury lze přistupovat jakoukoli funkcí, kdekoli v rozsahu struktury. Funkce uvnitř struktury: Struktury C nepovolují funkce uvnitř struktury, takže nemůžeme poskytnout související funkce. Statické členy: Struktura C nemůže mít v těle statické členy. Vytvoření konstrukce v Structure: Struktury v C nemohou mít konstruktor uvnitř Structures.
Související články
- C Structures vs C++ Structure
