logo

C Strukturer

Strukturen i C är en användardefinierad datatyp som kan användas för att gruppera objekt av möjligen olika typer till en enda typ. De struct nyckelord används för att definiera strukturen i programmeringsspråket C. Objekten i strukturen kallas dess medlem och de kan vara av vilken giltig datatyp som helst.

C Strukturer

C Strukturdeklaration

Vi måste deklarera struktur i C innan vi använder den i vårt program. I strukturdeklaration anger vi dess medlemsvariabler tillsammans med deras datatyp. Vi kan använda nyckelordet struct för att deklarera strukturen i C med följande syntax:



Syntax

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

Ovanstående syntax kallas även en strukturmall eller strukturprototyp och inget minne tilldelas strukturen i deklarationen.

C Strukturdefinition

För att använda struktur i vårt program måste vi definiera dess instans. Det kan vi göra genom att skapa variabler av strukturtypen. Vi kan definiera strukturvariabler med två metoder:

1. Strukturvariabeldeklaration med strukturmall

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

2. Strukturvariabeldeklaration efter strukturmall

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

Åtkomststrukturmedlemmar

Vi kan komma åt strukturmedlemmar genom att använda ( . ) punktoperator.



Syntax

structure_name.member1; strcuture_name.member2;>

I det fall vi har en pekare till strukturen kan vi också använda piloperatorn för att komma åt medlemmarna.

Initiera strukturmedlemmar

Strukturmedlemmar kan inte vara initieras med deklarationen. Till exempel misslyckas följande C-program i kompileringen.

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

Anledningen till ovanstående fel är enkel. När en datatyp deklareras tilldelas inget minne för den. Minne tilldelas endast när variabler skapas.



Vi kan initiera strukturmedlemmar på tre sätt som är följande:

  1. Använda Assignment Operator.
  2. Använder initieringslista.
  3. Använder designad initieringslista.

1. Initiering med Assignment Operator

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

2. Initiering med hjälp av Initialiseringslista

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

I denna typ av initiering tilldelas värdena i sekventiell ordning som de deklareras i strukturmallen.

3. Initiering med Designated Initializer List

Designerad initiering gör att strukturmedlemmar kan initieras i valfri ordning. Denna funktion har lagts till i C99-standarden.

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

Designated Initialization stöds endast i C men inte i C++.

Exempel på struktur i C

Följande C-program visar hur man använder strukturer

C


python-väginställning



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

>

>

Produktion

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 för strukturer

De typdef nyckelord används för att definiera ett alias för den redan existerande datatypen. I strukturer måste vi använda nyckelordet struct tillsammans med strukturnamnet för att definiera variablerna. Ibland ökar detta kodens längd och komplexitet. Vi kan använda typedef för att definiera något nytt kortare namn för strukturen.

Exempel

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

>

>

Produktion

var1.a = 20 var2.x = 314>

Kapslade strukturer

C-språk tillåter oss att infoga en struktur i en annan som medlem. Denna process kallas kapsling och sådana strukturer kallas kapslade strukturer. Det finns två sätt på vilka vi kan kapsla en struktur i en annan:

1. Inbäddad struktur

I den här metoden deklareras strukturen som kapslas också inuti den överordnade strukturen.

Exempel

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

2. Separat strukturhäckning

I den här metoden deklareras två strukturer separat och sedan kapslas medlemsstrukturen inuti den överordnade strukturen.

Exempel

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

En sak att notera här är att deklarationen av strukturen alltid ska finnas före dess definition som strukturmedlem. Till exempel nedanstående förklaring är ogiltig eftersom strukturminnet inte är definierat när det deklareras inuti den överordnade strukturen.

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

Få åtkomst till kapslade medlemmar

Vi kan komma åt kapslade medlemmar genom att använda samma ( . ) punktoperator två gånger som visas:

 str_parent.str_child .member;>

Exempel på strukturhäckning

C




en miljon i siffror

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

>

>

Produktion

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

Strukturpekare i C

Vi kan definiera en pekare som pekar på strukturen som vilken annan variabel som helst. Sådana pekare kallas i allmänhet Strukturpekare . Vi kan komma åt medlemmarna i strukturen som pekas av strukturpekaren med hjälp av ( -> ) piloperator.

Exempel på strukturpekare

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

>

>

Produktion

Skådespelerskan Sai Pallavi
1 2>

Självrefererande strukturer

De självrefererande strukturerna i C är de strukturer som innehåller referenser till samma typ som de själva, dvs de innehåller en medlem av typpekaren som pekar på samma strukturtyp.

Exempel på självrefererande strukturer

 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->nästa->mem1,> >ptr1->nästa->mem2);> > >return> 0;> }>

>

>

Produktion

var2.mem1: 10 var2.mem2: 20>

Sådana typer av strukturer används i olika datastrukturer som för att definiera noderna för länkade listor, träd, etc.

C Strukturstoppning och packning

Tekniskt sett bör storleken på strukturen i C vara summan av storleken på dess medlemmar. Men det kanske inte stämmer i de flesta fall. Anledningen till detta är Structure Padding.

Struktur stoppning är konceptet att lägga till flera tomma bytes i strukturen för att naturligt anpassa datamedlemmarna i minnet. Det görs för att minimera CPU-läscyklerna för att hämta olika datamedlemmar i strukturen.

Det finns vissa situationer där vi behöver packa strukturen tätt genom att ta bort de tomma byten. I sådana fall använder vi Strukturpackning. C-språk ger två sätt för strukturpackning:

  1. Använder #pragma pack(1)
  2. Använder __attribut((packed))__

Exempel på strukturstoppning och packning

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

>

>

Produktion

Size of str1: 8 Size of str2: 5>

Som vi kan se varierar strukturens storlek när strukturpackning utförs.

längdsträng

För att veta mer om strukturutfyllnad och packning, se den här artikeln - Bitfält används för att ange längden på strukturelementen i bitar. När vi vet den maximala längden på medlemmen kan vi använda bitfält för att specificera storleken och minska minnesförbrukningen.

Syntax för bitfält

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

Exempel på bitfält

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

>

>

Produktion

Size of Str1: 8 Size of Str2: 4>

Som vi kan se reduceras storleken på strukturen när du använder bitfältet för att definiera maxstorleken på medlemmen 'a'.

Användning av struktur i C

C-strukturer används för följande:

  1. Strukturen kan användas för att definiera de anpassade datatyper som kan användas för att skapa vissa komplexa datatyper som datum, tid, komplexa tal etc. som inte finns i språket.
  2. Den kan också användas i dataorganisation där en stor mängd data kan lagras i olika fält.
  3. Strukturer används för att skapa datastrukturer som träd, länkade listor etc.
  4. De kan också användas för att returnera flera värden från en funktion.

Begränsningar för C-strukturer

I C-språk ger strukturer en metod för att packa ihop data av olika typer. En struktur är ett användbart verktyg för att hantera en grupp av logiskt relaterade dataobjekt. Men C-strukturer har också vissa begränsningar.

    Högre minnesförbrukning: Det beror på strukturstoppning. Ingen datadöljning: C-strukturer tillåter inte datadöljning. Strukturelement kan nås av vilken funktion som helst, var som helst inom strukturens omfattning. Funktioner inuti strukturen: C-strukturer tillåter inte funktioner inuti strukturen så vi kan inte tillhandahålla de associerade funktionerna. Statiska delar: C Struktur kan inte ha statiska delar inuti kroppen. Konstruktionsskapande i Structure: Strukturer i C kan inte ha en konstruktor inuti Structures.

relaterade artiklar

  • C Structures vs C++ Structure