C Konstrukcijos
C struktūra yra vartotojo apibrėžtas duomenų tipas, kurį galima naudoti norint sugrupuoti įvairių tipų elementus į vieną tipą. The struktūrinis raktinis žodis naudojamas C programavimo kalbos struktūrai apibrėžti. Elementai struktūroje vadinami jos narys ir jie gali būti bet kokio galiojančio duomenų tipo.
C Struktūros deklaracija
Turime deklaruoti struktūrą C prieš naudodami ją savo programoje. Struktūros deklaracijoje nurodome jos narių kintamuosius kartu su jų duomenų tipu. Mes galime naudoti raktinį žodį struct, norėdami deklaruoti struktūrą C, naudodami šią sintaksę:
Sintaksė
struct structure_name { data_type member_name1; data_type member_name1; .... .... }; Aukščiau pateikta sintaksė taip pat vadinama struktūros šablonu arba struktūros prototipu ir deklaracijoje struktūrai neskiriama jokia atmintis.
C struktūros apibrėžimas
Norėdami naudoti struktūrą savo programoje, turime apibrėžti jos egzempliorių. Tai galime padaryti kurdami struktūros tipo kintamuosius. Struktūros kintamuosius galime apibrėžti dviem būdais:
1. Struktūros kintamojo deklaracija su struktūros šablonu
struct structure_name { data_type member_name1; data_type member_name1; .... .... } variable1, varaible2, ... ; 2. Struktūros kintamojo deklaracija po struktūros šablono
// structure declared beforehand struct structure_name variable1, variable2 , .......;
Prieigos struktūros nariai
Mes galime pasiekti struktūros narius naudodami ( . ) taško operatorius.
Sintaksė
structure_name.member1; strcuture_name.member2;
Tuo atveju, kai turime rodyklę į struktūrą, nariams pasiekti taip pat galime naudoti rodyklės operatorių.
Inicijuoti struktūros narius
Struktūros nariai negali būti inicijuojamas su deklaracija. Pavyzdžiui, ši C programa nepavyksta kompiliuojant.
struct Point { int x = 0; // COMPILER ERROR: cannot initialize members here int y = 0; // COMPILER ERROR: cannot initialize members here }; Aukščiau pateiktos klaidos priežastis yra paprasta. Kai deklaruojamas duomenų tipas, jam neskiriama atmintis. Atmintis paskirstoma tik tada, kai sukuriami kintamieji.
Mes galime inicijuoti struktūros narius 3 būdais, kurie yra tokie:
- Naudojant priskyrimo operatorių.
- Initializatorių sąrašo naudojimas.
- Paskirto inicijavimo sąrašo naudojimas.
1. Inicijavimas naudojant priskyrimo operatorių
struct structure_name str; str.member1 = value1; str.member2 = value2; str.member3 = value3; . . .
2. Inicijavimas naudojant inicijavimo sąrašą
struct structure_name str = { value1, value2, value3 }; Šio tipo inicijavimo atveju reikšmės priskiriamos nuoseklia tvarka, kaip jos deklaruojamos struktūros šablone.
3. Inicijuoti naudojant paskirtąjį inicijavimo sąrašą
Paskirtasis inicijavimas leidžia struktūros elementus inicijuoti bet kokia tvarka. Ši funkcija buvo įtraukta į C99 standartą.
struct structure_name str = { .member1 = value1, .member2 = value2, .member3 = value3 }; Paskirtasis inicijavimas palaikomas tik C, bet ne C++.
C struktūros pavyzdys
Šioje C programoje parodyta, kaip naudoti struktūras
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;> }> |
Išvestis
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 struktūroms
The typedef raktinis žodis naudojamas apibrėžti jau esamo duomenų tipo slapyvardį. Struktūrose kintamiesiems apibrėžti turime naudoti raktinį žodį struct kartu su struktūros pavadinimu. Kartais tai padidina kodo ilgį ir sudėtingumą. Galime naudoti typedef norėdami apibrėžti kokį nors naują trumpesnį struktūros pavadinimą.
Pavyzdys
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;> }> |
Išvestis
var1.a = 20 var2.x = 314
Įdėtos struktūros
C kalba leidžia įterpti vieną struktūrą į kitą kaip narį. Šis procesas vadinamas lizdu, o tokios struktūros vadinamos įdėtomis struktūromis. Yra du būdai, kaip galime sujungti vieną struktūrą į kitą:
1. Įterptųjų struktūrų įdėjimas
Taikant šį metodą, įdėta struktūra taip pat deklaruojama pagrindinėje struktūroje.
Pavyzdys
struct parent { int member1; struct member_str member2 { int member_str1; char member_str2; ... } ... } 2. Atskiras struktūrinis lizdas
Taikant šį metodą, dvi struktūros deklaruojamos atskirai, o tada narių struktūra įdedama į pirminę struktūrą.
Pavyzdys
struct member_str { int member_str1; char member_str2; ... } struct parent { int member1; struct member_str member2; ... } Vienas dalykas, į kurį reikia atkreipti dėmesį, yra tai, kad struktūros deklaracija visada turi būti pateikta prieš jos apibrėžimą kaip struktūros elementą. Pavyzdžiui, žemiau pateikta deklaracija negalioja nes struktūros mem neapibrėžiamas, kai jis deklaruojamas pagrindinėje struktūroje.
struct parent { struct mem a; }; struct mem { int var; }; Prieiga prie įdėtųjų narių
Įdėtus narius galime pasiekti naudodami tą patį (. ) taško operatorių du kartus, kaip parodyta:
str_parent.str_child .member;
Struktūros įdėjimo pavyzdys
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;> }> |
Išvestis
var1.a = 25 var1.b.x = 195 var1.b.c = A
Struktūros rodyklė C
Galime apibrėžti rodyklę, kuri nurodo struktūrą, kaip ir bet kurį kitą kintamąjį. Tokios rodyklės paprastai vadinamos Struktūros rodyklės . Mes galime pasiekti struktūros narius, nurodytus struktūros žymekliu, naudodami ( -> ) rodyklės operatorius.
Struktūros rodyklės pavyzdys
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);>> |