Strukturen i C er en brugerdefineret datatype, der kan bruges til at gruppere elementer af muligvis forskellige typer i en enkelt type. Det struct søgeord bruges til at definere strukturen i programmeringssproget C. Elementerne i strukturen kaldes dens medlem og de kan være af enhver gyldig datatype.
C Strukturdeklaration
Vi skal erklære struktur i C, før vi bruger det i vores program. I strukturdeklaration specificerer vi dens medlemsvariable sammen med deres datatype. Vi kan bruge nøgleordet struct til at erklære strukturen i C ved hjælp af følgende syntaks:
Syntaks
struct structure_name { data_type member_name1; data_type member_name1; .... .... };>
Ovenstående syntaks kaldes også en strukturskabelon eller strukturprototype, og der er ikke allokeret hukommelse til strukturen i deklarationen.
C Struktur Definition
For at bruge struktur i vores program, skal vi definere dens instans. Det kan vi gøre ved at oprette variabler af strukturtypen. Vi kan definere strukturvariabler ved hjælp af to metoder:
1. Strukturvariabelerklæring med strukturskabelon
struct structure_name { data_type member_name1; data_type member_name1; .... .... } variable1, varaible2, ... ;>
2. Strukturvariabelerklæring efter strukturskabelon
// structure declared beforehand struct structure_name variable1, variable2 , .......;>
Adgangsstrukturmedlemmer
Vi kan få adgang til strukturmedlemmer ved at bruge ( . ) prikoperator.
Syntaks
structure_name.member1; strcuture_name.member2;>
I det tilfælde, hvor vi har en pegepind til strukturen, kan vi også bruge pileoperatoren til at få adgang til medlemmerne.
Initialiser strukturmedlemmer
Strukturmedlemmer kan ikke være initialiseret med erklæringen. For eksempel fejler følgende C-program i kompileringen.
struct Point { int x = 0; // COMPILER ERROR: cannot initialize members here int y = 0; // COMPILER ERROR: cannot initialize members here };>
Årsagen til ovenstående fejl er enkel. Når en datatype erklæres, er der ikke allokeret hukommelse til den. Hukommelse tildeles kun, når variabler oprettes.
Vi kan initialisere strukturmedlemmer på 3 måder, som er som følger:
- Brug af Assignment Operator.
- Brug af initialiseringsliste.
- Brug af Designated Initializer List.
1. Initialisering ved hjælp af Assignment Operator
struct structure_name str; str.member1 = value1; str.member2 = value2; str.member3 = value3; . . .>
2. Initialisering ved hjælp af Initializer List
struct structure_name str = { value1, value2, value3 };>
I denne type initialisering tildeles værdierne i sekventiel rækkefølge, som de erklæres i strukturskabelonen.
3. Initialisering ved hjælp af Designated Initializer List
Designeret initialisering gør det muligt at initialisere strukturmedlemmer i vilkårlig rækkefølge. Denne funktion er blevet tilføjet i C99-standarden.
struct structure_name str = { .member1 = value1, .member2 = value2, .member3 = value3 };>
Designated Initialization understøttes kun i C, men ikke i C++.
Eksempel på struktur i C
Det følgende C-program viser, hvordan man bruger strukturer
C
oprette forbindelse til en database java
// 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 for strukturer
Det typedef nøgleord bruges til at definere et alias for den allerede eksisterende datatype. I strukturer skal vi bruge nøgleordet struct sammen med strukturnavnet for at definere variablerne. Nogle gange øger dette kodens længde og kompleksitet. Vi kan bruge typedef til at definere et nyt kortere navn til strukturen.
Eksempel
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>
Indlejrede strukturer
C-sprog giver os mulighed for at indsætte en struktur i en anden som medlem. Denne proces kaldes indlejring, og sådanne strukturer kaldes indlejrede strukturer. Der er to måder, hvorpå vi kan indlejre en struktur i en anden:
1. Indlejret struktur indlejring
I denne metode erklæres den struktur, der indlejres, også inde i den overordnede struktur.
Eksempel
struct parent { int member1; struct member_str member2 { int member_str1; char member_str2; ... } ... }>
2. Separat strukturindlejring
I denne metode erklæres to strukturer separat, og derefter indlejres medlemsstrukturen inde i den overordnede struktur.
Eksempel
struct member_str { int member_str1; char member_str2; ... } struct parent { int member1; struct member_str member2; ... }>
En ting at bemærke her er, at erklæringen om strukturen altid skal være til stede før dens definition som et strukturmedlem. For eksempel nedenstående erklæring er ugyldig da struct memmet ikke er defineret, når det erklæres inde i den overordnede struktur.
struct parent { struct mem a; }; struct mem { int var; };>
Adgang til indlejrede medlemmer
Vi kan få adgang til indlejrede medlemmer ved at bruge den samme ( . ) prikoperator to gange som vist:
str_parent.str_child .member;>
Eksempel på strukturindlejring
C
polymorfi i java
// 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>
Strukturpointer i C
Vi kan definere en pointer, der peger på strukturen som enhver anden variabel. Sådanne pointere kaldes generelt Strukturpointer . Vi kan få adgang til medlemmerne af strukturen, der peges af strukturmarkøren ved hjælp af ( -> ) pileoperator.
Eksempel på 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;> }> |
>
>Produktion
1 2>
Selvrefererende strukturer
De selvrefererende strukturer i C er de strukturer, der indeholder referencer til samme type som dem selv, dvs. de indeholder et medlem af typemarkøren, der peger på den samme strukturtype.
Eksempel på selvrefererende 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æste->mem1,> > ptr1->næste->mem2);> > > return> 0;> }> |
>
sorter array liste
>Produktion
var2.mem1: 10 var2.mem2: 20>
Sådanne slags strukturer bruges i forskellige datastrukturer, såsom til at definere knudepunkterne for sammenkædede lister, træer osv.
C Strukturpolstring og pakning
Teknisk set bør størrelsen af strukturen i C være summen af størrelserne af dens medlemmer. Men det er måske ikke rigtigt i de fleste tilfælde. Årsagen til dette er strukturpolstring.
Struktur polstring er konceptet med at tilføje flere tomme bytes i strukturen for naturligt at justere datamedlemmerne i hukommelsen. Det gøres for at minimere CPU-læsecyklusserne for at hente forskellige datamedlemmer i strukturen.
Der er nogle situationer, hvor vi skal pakke strukturen tæt ved at fjerne de tomme bytes. I sådanne tilfælde bruger vi Strukturpakning. C-sprog giver to måder til strukturpakning:
- Brug af #pragma pack(1)
- Brug af __attribut((pakket))__
Eksempel på strukturpolstring og pakning
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, varierer størrelsen af strukturen, når strukturpakning udføres.
For at vide mere om strukturpolstring og pakning, se denne artikel - Bitfelter bruges til at angive længden af strukturelementerne i bits. Når vi kender den maksimale længde af medlemmet, kan vi bruge bitfelter til at angive størrelsen og reducere hukommelsesforbruget.
Syntaks af bitfelter
struct structure_name { data_type member_name : width_of_bit-field; };>
Eksempel på bitfelter
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, reduceres størrelsen af strukturen, når du bruger bitfeltet til at definere den maksimale størrelse af medlemmet 'a'.
Brug af struktur i C
C-strukturer bruges til følgende:
- Strukturen kan bruges til at definere de brugerdefinerede datatyper, der kan bruges til at skabe nogle komplekse datatyper såsom datoer, klokkeslæt, komplekse tal osv., som ikke er til stede i sproget.
- Det kan også bruges i dataorganisation, hvor en stor mængde data kan lagres i forskellige felter.
- Strukturer bruges til at skabe datastrukturer såsom træer, linkede lister osv.
- De kan også bruges til at returnere flere værdier fra en funktion.
Begrænsninger af C-strukturer
I C-sprog giver strukturer en metode til at pakke data af forskellige typer sammen. En struktur er et nyttigt værktøj til at håndtere en gruppe af logisk relaterede dataelementer. C-strukturer har dog også nogle begrænsninger.
- Højere hukommelsesforbrug: Det skyldes strukturpolstring. Ingen dataskjul: C-strukturer tillader ikke dataskjulning. Strukturelementer kan tilgås af enhver funktion, hvor som helst i strukturens omfang. Funktioner inde i strukturen: C-strukturer tillader ikke funktioner inde i strukturen, så vi kan ikke levere de tilknyttede funktioner. Statiske elementer: C-strukturen kan ikke have statiske elementer inde i kroppen. Konstruktionsoprettelse i Structure: Strukturer i C kan ikke have en konstruktør inde i Structures.
relaterede artikler
- C Structures vs C++ Structure