logo

C Structuri

Structura din C este un tip de date definit de utilizator care poate fi folosit pentru a grupa articole de tipuri posibil diferite într-un singur tip. The cuvânt cheie struct este folosit pentru a defini structura în limbajul de programare C. Elementele din structură se numesc sale membru și pot fi de orice tip de date valide.

C Structuri

C Declarație de structură

Trebuie să declarăm structura în C înainte de a o folosi în programul nostru. În declarația de structură, specificăm variabilele sale membre împreună cu tipul lor de date. Putem folosi cuvântul cheie struct pentru a declara structura în C folosind următoarea sintaxă:



Sintaxă

 struct structure_name { data_type member_name1;  data_type member_name1; .... .... };>

Sintaxa de mai sus se mai numește șablon de structură sau prototip de structură și nicio memorie nu este alocată structurii din declarație.

C Definiția structurii

Pentru a folosi structura în programul nostru, trebuie să definim instanța acesteia. Putem face asta prin crearea de variabile de tip structură. Putem defini variabilele de structură folosind două metode:

1. Declarație de variabile de structură cu șablon de structură

 struct structure_name { data_type member_name1; data_type member_name1; .... .... }  variable1, varaible2, ...  ;>

2. Declarație variabilă de structură după șablon de structură

// structure declared beforehand struct structure_name  variable1, variable2  , .......;>

Accesați membrii structurii

Putem accesa membrii structurii utilizând ( . ) operator punct.



Sintaxă

structure_name.member1; strcuture_name.member2;>

În cazul în care avem un pointer către structură, putem folosi și operatorul săgeată pentru a accesa membrii.

Inițializați membrii structurii

Membrii structurii nu poate fi initializat cu declaratia. De exemplu, următorul program C eșuează la compilare.

tutorial javafx
struct Point { int x = 0; // COMPILER ERROR: cannot initialize members here int y = 0; // COMPILER ERROR: cannot initialize members here };>

Motivul erorii de mai sus este simplu. Când un tip de date este declarat, nu i se alocă memorie. Memoria este alocată numai atunci când sunt create variabile.



Putem inițializa membrii structurii în 3 moduri, care sunt după cum urmează:

  1. Folosind Assignment Operator.
  2. Utilizarea Listei de inițializare.
  3. Utilizarea listei de inițializatori desemnate.

1. Inițializare folosind Assignment Operator

 struct structure_name str; str.member1 = value1; str.member2 = value2; str.member3 = value3; . . .>

2. Inițializarea utilizând Lista de inițializare

 struct structure_name str = { value1, value2, value3 };>

În acest tip de inițializare, valorile sunt atribuite în ordine secvențială, așa cum sunt declarate în șablonul de structură.

3. Inițializarea utilizând Lista de inițializare desemnată

Inițializarea desemnată permite inițializarea membrilor structurii în orice ordine. Această caracteristică a fost adăugată în standardul C99.

 struct structure_name str = { .member1 = value1, .member2 = value2, .member3 = value3 };>

Inițializarea desemnată este acceptată numai în C, dar nu și în C++.

Exemplu de structură în C

Următorul program C arată cum să utilizați structurile

C




// 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;> }>

>

>

Ieșire

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 pentru Structuri

The typedef cuvântul cheie este folosit pentru a defini un alias pentru tipul de date deja existent. În structuri, trebuie să folosim cuvântul cheie struct împreună cu numele structurii pentru a defini variabilele. Uneori, acest lucru crește lungimea și complexitatea codului. Putem folosi typedef pentru a defini un nou nume mai scurt pentru structură.

Exemplu

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;> }>

>

>

Ieșire

bandă de bază vs bandă largă
var1.a = 20 var2.x = 314>

Structuri imbricate

Limbajul C ne permite să inserăm o structură în alta ca membru. Acest proces se numește imbricare și astfel de structuri se numesc structuri imbricate. Există două moduri în care putem cuibari o structură în alta:

1. Imbricarea structurii încorporate

În această metodă, structura care este imbricată este de asemenea declarată în interiorul structurii părinte.

Exemplu

struct parent { int member1; struct member_str member2 { int member_str1; char member_str2; ... } ... }>

2. Imbricare de structuri separate

În această metodă, două structuri sunt declarate separat și apoi structura membru este imbricată în structura părinte.

Exemplu

struct member_str { int member_str1; char member_str2; ... } struct parent { int member1; struct member_str member2; ... }>

Un lucru de remarcat aici este că declarația structurii ar trebui să fie întotdeauna prezentă înainte de definirea acesteia ca membru al structurii. De exemplu, cel declarația de mai jos este nevalidă deoarece struct mem nu este definit atunci când este declarat în interiorul structurii părinte.

struct parent { struct mem a; }; struct mem { int var; };>

Accesarea membrilor imbricați

Putem accesa membri imbricați utilizând același operator punct ( . ) de două ori, așa cum se arată:

 str_parent.str_child .member;>

Exemplu de imbricare a structurii

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;> }>

>

orașe din australia

>

Ieșire

var1.a = 25 var1.b.x = 195 var1.b.c = A>

Structura indicator în C

Putem defini un pointer care indică spre structură ca orice altă variabilă. Astfel de indicatoare sunt în general numite Structura Indicatori . Putem accesa membrii structurii indicați de indicatorul de structură folosind ( -> ) operator săgeată.

Exemplu de Structure Pointer

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;> }>

>

>

Ieșire

1 2>

Structuri autoreferențiale

Structurile autoreferențiale din C sunt acele structuri care conțin referințe la același tip ca ele, adică conțin un membru al indicatorului de tip care indică același tip de structură.

Exemplu de structuri autoreferențiale

 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->următor->mem1,>>> ptr1->următorul->mem2);>>> >return> 0;> }>

>

>

șir și subșir
Ieșire

var2.mem1: 10 var2.mem2: 20>

Astfel de tipuri de structuri sunt utilizate în diferite structuri de date, cum ar fi pentru a defini nodurile listelor legate, arborilor etc.

C Structura Umplutură și ambalare

Din punct de vedere tehnic, dimensiunea structurii în C ar trebui să fie suma dimensiunilor membrilor săi. Dar s-ar putea să nu fie adevărat în majoritatea cazurilor. Motivul pentru aceasta este Structure Padding.

Captuseala structurii este conceptul de a adăuga mai mulți octeți gol în structură pentru a alinia în mod natural membrii de date din memorie. Se face pentru a minimiza ciclurile de citire a CPU pentru a prelua diferiți membri de date din structură.

Există unele situații în care trebuie să împachetăm structura strâns prin eliminarea octeților goli. În astfel de cazuri, folosim Ambalarea structurii. Limbajul C oferă două moduri de împachetare a structurii:

  1. Folosind #pragma pack(1)
  2. Folosind __attribute((ambalat))__

Exemplu de umplutură și ambalare a structurii

C




// 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;> }>

>

>

Ieșire

Size of str1: 8 Size of str2: 5>

După cum putem vedea, dimensiunea structurii este variată atunci când se realizează ambalarea structurii.

Pentru a afla mai multe despre umplutura și împachetarea structurii, consultați acest articol – Câmpurile de biți sunt folosite pentru a specifica lungimea membrilor structurii în biți. Când știm lungimea maximă a membrului, putem folosi câmpuri de biți pentru a specifica dimensiunea și pentru a reduce consumul de memorie.

Sintaxa câmpurilor de biți

struct structure_name  { data_type member_name : width_of_bit-field; };>

Exemplu de câmpuri de biți

C

colecții în java




// 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;> }>

>

>

Ieșire

Size of Str1: 8 Size of Str2: 4>

După cum putem vedea, dimensiunea structurii este redusă atunci când se utilizează câmpul de biți pentru a defini dimensiunea maximă a membrului „a”.

Utilizări ale structurii în C

Structurile C sunt utilizate pentru următoarele:

  1. Structura poate fi utilizată pentru a defini tipurile de date personalizate care pot fi utilizate pentru a crea unele tipuri de date complexe, cum ar fi datele, ora, numerele complexe etc. care nu sunt prezente în limbaj.
  2. Poate fi folosit și în organizarea datelor unde o cantitate mare de date poate fi stocată în diferite câmpuri.
  3. Structurile sunt folosite pentru a crea structuri de date, cum ar fi arbori, liste legate etc.
  4. Ele pot fi folosite și pentru returnarea mai multor valori dintr-o funcție.

Limitările structurilor C

În limbajul C, structurile oferă o metodă de împachetare a datelor de diferite tipuri. O structură este un instrument util pentru a gestiona un grup de elemente de date legate logic. Cu toate acestea, structurile C au și unele limitări.

    Consum mai mare de memorie: se datorează căptușelii structurii. Fără ascundere a datelor: Structurile C nu permit ascunderea datelor. Membrii structurii pot fi accesați de orice funcție, oriunde în domeniul de aplicare al structurii. Funcții în interiorul structurii: structurile C nu permit funcții în interiorul structurii, așa că nu putem furniza funcțiile asociate. Membri statici: Structura C nu poate avea membri statici în interiorul corpului său. Crearea construcției în Structure: Structurile în C nu pot avea un constructor în Structuri.

Articole similare

  • Structuri C vs Structura C++