czwartek, 26 kwietnia 2018

Język C - Struktury

C - Struktury

Tablice pozwalają zdefiniować typ zmiennych, które mogą pomieścić kilka elementów danych tego samego rodzaju. Podobnie struktura to inny zdefiniowany przez użytkownika typ danych dostępny w języku C, który pozwala łączyć elementy danych różnego rodzaju.
Struktury są używane do reprezentowania rekordu. Załóżmy, że chcesz śledzić swoje książki w bibliotece. Możesz chcieć śledzić następujące atrybuty każdej książki -
  • Tytuł
  • Autor
  • Przedmiot
  • Identyfikator książki

Definiowanie struktury

Aby zdefiniować strukturę, musisz użyć instrukcji struct. Instrukcja struct definiuje nowy typ danych z więcej niż jednym elementem. Format instrukcji struct jest następujący:
struct [tag struktury] {

definicja elementu;
definicja elementu;


definicja elementu;
} [jedna lub więcej zmiennych struktury]; 
Tag struktury jest opcjonalny, a każda definicja elementu jest normalną definicją zmiennej, na przykład int i; lub float f; lub dowolną inną prawidłową definicję zmiennej. Na końcu definicji struktury, przed ostatnim średnikiem, można określić jedną lub więcej zmiennych struktury, ale jest to opcjonalne. Oto sposób, w jaki zadeklarowałbyś strukturę dla Ksiazki:
struct Ksiazka {
   char  tytul[50];
   char  autor[50];
   char  temat[100];
   int   ksiazka_id;
} ksiazka; 

Dostęp do elementów struktury

Aby uzyskać dostęp do dowolnego elementu struktury, używamy operatora dostępu do elementu (.) . Operator dostępu do członów jest kodowany jako okres między nazwą zmiennej struktury a elementem struktury, do którego chcemy uzyskać dostęp. Można użyć słowa kluczowego struct w celu zdefiniowania zmiennych typu struktury. Poniższy przykład pokazuje, jak używać struktury w programie:
#include <stdio.h>
#include <string.h>

struct Ksiazka {
   char  tytul[50];
   char  autor[50];
   char  temat[100];
   int   ksiazka_id;
} ksiazka;

int main( ) {

   struct Ksiazka Ksiazka1;        /* Zadeklarowanie Ksiazka1 typu Ksiazka */
   struct Ksiazka Ksiazka2;        /* Zadeklarowanie Ksiazka2 typu Ksiazka */

   /* ksiazka 1 specyfikacja */
   strcpy( Ksiazka1.tytul, "C Programowanie");
   strcpy( Ksiazka1.autor, "Nuha Ali");
   strcpy( Ksiazka1.temat, "C Programowanie Tutorial");
   Ksiazka1.ksiazka_id = 2222222;

   /* ksiazka 2 specyfikacja */
   strcpy( Ksiazka2.tytul, "C++ programowanie");
   strcpy( Ksiazka2.autor, "Zara Ali");
   strcpy( Ksiazka2.temat, "C++ programowanie Tutorial");
   Ksiazka2.ksiazka_id = 2222223;

   /* wyswietl zawartosc Ksiazka1 */
   printf( "Ksiazka 1 tytul : %s\n", Ksiazka1.tytul);
   printf( "Ksiazka 1 autor : %s\n", Ksiazka1.autor);
   printf( "Ksiazka 1 temat : %s\n", Ksiazka1.temat);
   printf( "Ksiazka 1 ksiazka_id : %d\n", Ksiazka1.ksiazka_id);

   /* wyswietl zawartosc Ksiazka2 */
   printf( "Ksiazka 2 tytul : %s\n", Ksiazka2.tytul);
   printf( "Ksiazka 2 autor : %s\n", Ksiazka2.autor);
   printf( "Ksiazka 2 temat : %s\n", Ksiazka2.temat);
   printf( "Ksiazka 2 Ksiazka_id : %d\n", Ksiazka2.ksiazka_id);

   return 0;
}
Gdy powyższy kod zostanie skompilowany i wykonany, generuje następujący wynik:
Ksiazka 1 tytul : C Programowanie
Ksiazka 1 autor : Nuha Ali
Ksiazka 1 temat : C Programowanie Tutorial
Ksiazka 1 ksiazka_id : 2222222
Ksiazka 2 tytul : C++ programowanie
Ksiazka 2 autor : Zara Ali
Ksiazka 2 temat : C++ programowanie Tutorial
Ksiazka 2 ksiazka_id : 2222223

Struktury jako Argumenty funkcji

Możesz przekazać strukturę jako argument funkcji w taki sam sposób, w jaki przekazujesz dowolną inną zmienną lub wskaźnik.
#include <stdio.h>
#include <string.h>

struct Ksiazka {
   char  tytul[50];
   char  autor[50];
   char  temat[100];
   int   ksiazka_id;
};

/* deklaracja funkcji */
void drukujKsiazke( struct Ksiazka ksiazka );

int main( ) {

   struct Ksiazka Ksiazka1;        /* Deklaracja Ksiazka1 typu Ksiazka */
   struct Ksiazka Ksiazka2;        /* Deklaracja Ksiazka2 typu Ksiazka */

   /* ksiazka 1 specyfikacja */
   strcpy( Ksiazka1.tytul, "C Programowanie");
   strcpy( Ksiazka1.autor, "Nuha Ali");
   strcpy( Ksiazka1.temat, "C Programowanie Tutorial");
   Ksiazka1.ksiazka_id = 2222222;

   /* ksiazka 2 specyfikacja */
   strcpy( Ksiazka2.tytul, "C++ Programowanie");
   strcpy( Ksiazka2.autor, "Zara Ali");
   strcpy( Ksiazka2.temat, "C++ Programowanie Tutorial");
   Ksiazka2.ksiazka_id = 2222223;

   /* drukuj informacje o Ksiazka1 */
   drukujKsiazke( Ksiazka1 );

   /* drukuj informacje o Ksiazka2 */
   drukujKsiazke( Ksiazka2 );

   return 0;
}

void drukujKsiazke( struct Ksiazka ksiazka ) {

   printf( "Ksiazka tytul : %s\n", ksiazka.tytul);
   printf( "Ksiazka autor : %s\n", ksiazka.autor);
   printf( "Ksiazka temat : %s\n", ksiazka.temat);
   printf( "Ksiazka ksiazka_id : %d\n", ksiazka.ksiazka_id);
}
Gdy powyższy kod zostanie skompilowany i wykonany, generuje następujący wynik:
Ksiazka tytul : C Programowanie
Ksiazka autor : Nuha Ali
Ksiazka temat : C Programowanie Tutorial
Ksiazka ksiazka_id : 2222222
Ksiazka tytul : C++ programowanie
Ksiazka autor : Zara Ali
Ksiazka temat : C++ Programowanie Tutorial
Ksiazka ksiazka_id : 2222223

Wskaźniki do struktur

Możesz definiować wskaźniki do struktur w taki sam sposób, jak definiujesz wskaźnik do dowolnej innej zmiennej -
struct Ksiazka *wskaźnik_struktury;
Teraz możesz zapisać adres zmiennej struktury w zdefiniowanej powyżej zmiennej wskaźnika. Aby znaleźć adres zmiennej struktury, umieść znak "&"; przed nazwą struktury w następujący sposób -
wskaźnik_struktury = &Ksiazka1;
Aby uzyskać dostęp do elementów struktury za pomocą wskaźnika do tej struktury, należy użyć operatora w następujący sposób -
wskaźnik_struktury->tytul;
Prześlijmy powyższy przykład za pomocą wskaźnika struktury.
#include <stdio.h>
#include <string.h>

struct Ksiazka {
   char  tytul[50];
   char  autor[50];
   char  temat[100];
   int   ksiazka_id;
};

/* deklaracja funkcji */
void drukujKsiazke( struct Ksiazka *ksiazka );

int main( ) {

   struct Ksiazka Ksiazka1;        /* Deklaracja Ksiazka1 typu Ksiazka */
   struct Ksiazka Ksiazka2;        /* Deklaracja Ksiazka2 typu Ksiazka */

   /* ksiazka 1 specyfikacja */
   strcpy( Ksiazka1.tytul, "C Programowanie");
   strcpy( Ksiazka1.autor, "Nuha Ali");
   strcpy( Ksiazka1.temat, "C Programowanie Tutorial");
   Ksiazka1.ksiazka_id = 2222222;

   /* ksiazka 2 specyfikacja */
   strcpy( Ksiazka2.tytul, "C++ Programowanie");
   strcpy( Ksiazka2.autor, "Zara Ali");
   strcpy( Ksiazka2.temat, "C++ Programowanie Tutorial");
   Ksiazka2.ksiazka_id = 2222223;

   /* drukuj informacje o Ksiazka1 */
   drukujKsiazke( &Ksiazka1 );

   /* drukuj informacje o Ksiazka2 */
   drukujKsiazke( &Ksiazka2 );

   return 0;
}

void drukujKsiazke( struct Ksiazka *ksiazka ) {

   printf( "Ksiazka tytul : %s\n", ksiazka->tytul);
   printf( "Ksiazka autor : %s\n", ksiazka->autor);
   printf( "Ksiazka temat : %s\n", ksiazka->temat);
   printf( "Ksiazka ksiazka_id : %d\n", ksiazka->ksiazka_id);
}
Gdy powyższy kod zostanie skompilowany i wykonany, generuje następujący wynik:
Ksiazka tytul : C Programowanie
Ksiazka autor : Nuha Ali
Ksiazka temat : C Programowanie Tutorial
Ksiazka ksiazka_id : 2222222
Ksiazka tytul : C++ programowanie
Ksiazka autor : Zara Ali
Ksiazka temat : C++ Programowanie Tutorial
Ksiazka ksiazka_id : 2222223

Pola bitowe

Pola bitowe umożliwiają pakowanie danych w strukturę. Jest to szczególnie przydatne, gdy pamięć lub przechowywanie danych jest na wagę złota. Typowe przykłady to:
·      Pakowanie kilku obiektów do słowa maszynowego. np. flagi jednobitowe mogą być zagęszczane.
·      Odczytywanie zewnętrznych formatów plików - można odczytywać niestandardowe formaty plików, np. 9-bitowe liczby całkowite.
C pozwala nam to zrobić w definicji struktury poprzez wprowadzenie: długości bitowej po zmiennej. Na przykład:
struct packed_struct {
   unsigned int f1:1;
   unsigned int f2:1;
   unsigned int f3:1;
   unsigned int f4:1;
   unsigned int type:4;
   unsigned int my_int:9;
} pack;
Tutaj, packed_struct zawiera 6 elementów: Cztery 1-bitowe flagi f1..f3, 4-bitowy typ i 9-bitowy my_int.
C automatycznie pakuje powyższe pola bitów tak zwięźle, jak to możliwe, pod warunkiem, że maksymalna długość pola jest mniejsza lub równa całkowitej długości słowa komputera. Jeśli tak nie jest, to niektóre kompilatory mogą pozwolić na nakładanie się pól pamięci, podczas gdy inne będą przechowywać następne pole w następnym słowie.

Poprzednia strona                                                          Następna strona


Brak komentarzy:

Prześlij komentarz