Struktura w C to typ danych zdefiniowany przez użytkownika, którego można użyć do grupowania elementów możliwie różnych typów w jeden typ. The słowo kluczowe struct służy do definiowania struktury w języku programowania C. Elementy tej struktury nazywane są jej członek i mogą mieć dowolny prawidłowy typ danych.
Deklaracja struktury C
Musimy zadeklarować strukturę w C przed użyciem jej w naszym programie. W deklaracji struktury podajemy jej zmienne składowe wraz z ich typem danych. Możemy użyć słowa kluczowego struct do zadeklarowania struktury w C, używając następującej składni:
Składnia
struct structure_name { data_type member_name1; data_type member_name1; .... .... };> Powyższa składnia nazywana jest także szablonem struktury lub prototypem struktury i w deklaracji do struktury nie jest przydzielana żadna pamięć.
Definicja struktury C
Aby użyć struktury w naszym programie, musimy zdefiniować jej instancję. Możemy to zrobić tworząc zmienne typu struktura. Zmienne struktury możemy definiować dwoma metodami:
algorytm kmp
1. Deklaracja zmiennej struktury z szablonem struktury
struct structure_name { data_type member_name1; data_type member_name1; .... .... } variable1, varaible2, ... ;> 2. Deklaracja zmiennej struktury po szablonie struktury
// structure declared beforehand struct structure_name variable1, variable2 , .......;>
Członkowie struktury dostępu
Dostęp do elementów struktury możemy uzyskać za pomocą metody ( . ) operator kropki.
Składnia
structure_name.member1; strcuture_name.member2;>
W przypadku, gdy mamy wskaźnik do struktury, możemy również użyć operatora strzałki, aby uzyskać dostęp do prętów.
Zainicjuj elementy struktury
Członkowie struktury nie może być zainicjowany deklaracją. Na przykład kompilacja następującego programu w języku C kończy się niepowodzeniem.
struct Point { int x = 0; // COMPILER ERROR: cannot initialize members here int y = 0; // COMPILER ERROR: cannot initialize members here };> Przyczyna powyższego błędu jest prosta. Kiedy zadeklarowany jest typ danych, nie jest dla niego przydzielana żadna pamięć. Pamięć jest przydzielana tylko podczas tworzenia zmiennych.
Możemy inicjować elementy struktury na 3 sposoby, które są następujące:
- Korzystanie z operatora przypisania.
- Korzystanie z listy inicjatorów.
- Korzystanie z listy wyznaczonych inicjatorów.
1. Inicjalizacja za pomocą operatora przypisania
struct structure_name str; str.member1 = value1; str.member2 = value2; str.member3 = value3; . . .>
2. Inicjalizacja za pomocą listy inicjatorów
struct structure_name str = { value1, value2, value3 };> W tego typu inicjalizacji wartości przypisywane są w kolejności, w jakiej są zadeklarowane w szablonie konstrukcji.
3. Inicjalizacja przy użyciu listy wyznaczonych inicjatorów
Wyznaczona inicjalizacja umożliwia inicjowanie elementów struktury w dowolnej kolejności. Ta funkcja została dodana w standardzie C99.
struct structure_name str = { .member1 = value1, .member2 = value2, .member3 = value3 };> Wyznaczona inicjalizacja jest obsługiwana tylko w C, ale nie w C++.
Przykład struktury w C
Poniższy program w języku C pokazuje, jak używać struktur
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;> }> |
>
>Wyjście
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 dla struktur
The typedef słowo kluczowe służy do zdefiniowania aliasu dla już istniejącego typu danych. W strukturach musimy użyć słowa kluczowego struct wraz z nazwą struktury, aby zdefiniować zmienne. Czasami zwiększa to długość i złożoność kodu. Możemy użyć typedef do zdefiniowania nowej, krótszej nazwy struktury.
Przykład
C
mójlivecricket w
// 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;> }> |
>
>Wyjście
var1.a = 20 var2.x = 314>
Struktury zagnieżdżone
Język C pozwala nam wstawić jedną strukturę do drugiej jako element członkowski. Proces ten nazywany jest zagnieżdżaniem, a takie struktury nazywane są strukturami zagnieżdżonymi. Istnieją dwa sposoby zagnieżdżania jednej struktury w drugiej:
1. Zagnieżdżanie struktur osadzonych
W tej metodzie zagnieżdżona struktura jest również deklarowana wewnątrz struktury nadrzędnej.
Przykład
struct parent { int member1; struct member_str member2 { int member_str1; char member_str2; ... } ... }> 2. Oddzielne zagnieżdżanie struktur
W tej metodzie dwie struktury są deklarowane oddzielnie, a następnie struktura prętowa jest zagnieżdżana w strukturze macierzystej.
Przykład
struct member_str { int member_str1; char member_str2; ... } struct parent { int member1; struct member_str member2; ... }> Należy tutaj zauważyć, że deklaracja struktury powinna być zawsze obecna przed jej zdefiniowaniem jako elementu struktury. Na przykład poniższe oświadczenie jest nieważne ponieważ struktura mem nie jest zdefiniowana, gdy jest zadeklarowana wewnątrz struktury nadrzędnej.
struct parent { struct mem a; }; struct mem { int var; };> Dostęp do zagnieżdżonych elementów członkowskich
Możemy uzyskać dostęp do zagnieżdżonych członków, używając tego samego operatora kropki ( . ) dwa razy, jak pokazano:
str_parent.str_child .member;>
Przykład zagnieżdżenia struktur
C
char + int w Javie
// 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;> }> |
>
>Wyjście
var1.a = 25 var1.b.x = 195 var1.b.c = A>
Wskaźnik struktury w C
Możemy zdefiniować wskaźnik wskazujący na strukturę jak każdą inną zmienną. Takie wskaźniki są powszechnie nazywane Wskaźniki struktury . Dostęp do elementów struktury wskazanych przez wskaźnik struktury możemy uzyskać za pomocą metody ( -> ) operator strzałki.
Przykład wskaźnika struktury
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;> }> |
>
>Wyjście
1 2>
Struktury samoodnoszące się
Struktury samoodnoszące się w C to te struktury, które zawierają odniesienia do tego samego typu co one same, tj. zawierają element członkowski wskaźnika typu wskazującego na ten sam typ struktury.
Przykład struktur samoodnoszących się
struct structure_name { data_type member1; data_type member2; struct structure_name* str; }> C
usuń ostatni znak z ciągu
// 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->następny->pamięć1,> >ptr1->następny->mem2);> > >return> 0;> }> |
>
>Wyjście
var2.mem1: 10 var2.mem2: 20>
Tego rodzaju struktury są używane w różnych strukturach danych, np. do definiowania węzłów połączonych list, drzew itp.
Wyściółka i opakowanie struktury C
Technicznie rzecz biorąc, rozmiar konstrukcji w C powinien być sumą rozmiarów jej elementów. Ale w większości przypadków może to nie być prawdą. Powodem tego jest dopełnienie struktury.
Wyściółka strukturalna to koncepcja dodawania wielu pustych bajtów do struktury w celu naturalnego wyrównania elementów danych w pamięci. Ma to na celu zminimalizowanie cykli odczytu procesora w celu pobrania różnych elementów danych w strukturze.
W niektórych sytuacjach musimy szczelnie spakować strukturę, usuwając puste bajty. W takich przypadkach używamy Pakowanie struktury. Język C udostępnia dwa sposoby pakowania struktur:
- Korzystanie z pakietu #pragma(1)
- Używanie __attribute((spakowane))__
Przykład wyściółki i pakowania struktury
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;> }> |
>
>Wyjście
Size of str1: 8 Size of str2: 5>
Jak widać, wielkość konstrukcji ulega zmianie w trakcie upakowania konstrukcji.
Aby dowiedzieć się więcej na temat wypełniania i pakowania struktury, zapoznaj się z tym artykułem – Pola bitowe służą do określenia długości elementów struktury w bitach. Kiedy znamy maksymalną długość elementu, możemy użyć pól bitowych, aby określić rozmiar i zmniejszyć zużycie pamięci.
Składnia pól bitowych
struct structure_name { data_type member_name : width_of_bit-field; };> Przykład pól bitowych
C
10 ml na uncję
// 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;> }> |
>
>Wyjście
Size of Str1: 8 Size of Str2: 4>
Jak widzimy, rozmiar struktury ulega zmniejszeniu, gdy pole bitowe definiuje maksymalny rozmiar elementu „a”.
Zastosowania struktury w C
Struktury C są używane do następujących celów:
- Struktura może służyć do definiowania niestandardowych typów danych, które można wykorzystać do tworzenia niektórych złożonych typów danych, takich jak daty, godziny, liczby zespolone itp., które nie są obecne w języku.
- Można go również stosować w organizacji danych, gdzie duża ilość danych może być przechowywana w różnych polach.
- Struktury służą do tworzenia struktur danych, takich jak drzewa, listy połączone itp.
- Można ich również używać do zwracania wielu wartości z funkcji.
Ograniczenia struktur C
W języku C struktury zapewniają metodę pakowania danych różnych typów. Struktura jest pomocnym narzędziem do obsługi grupy logicznie powiązanych elementów danych. Jednak struktury C mają również pewne ograniczenia.
- Wyższe zużycie pamięci: Wynika to z dopełnienia struktury. Brak ukrywania danych: Struktury C nie pozwalają na ukrywanie danych. Dostęp do elementów struktury można uzyskać za pomocą dowolnej funkcji w dowolnym miejscu struktury. Funkcje wewnątrz struktury: Struktury C nie pozwalają na funkcje wewnątrz struktury, więc nie możemy zapewnić powiązanych funkcji. Elementy statyczne: Struktura C nie może zawierać elementów statycznych w swojej treści. Tworzenie konstrukcji w Strukturze: Struktury w C nie mogą mieć konstruktora wewnątrz Struktur.
Powiązane artykuły
- Struktury C a struktura C++
