Struktury w C

W języku C jest możliwość tworzenia struktur, czyli takich tablic o różnych typach danych. Struktury są bardzo podobne do obiektów i ułatwiają definiowanie kilku cech dla jednej rzeczy. Aby stworzyć strukturę należy użyć słowa kluczowego struct i podać typy danych dla danej struktury. Dane struktur można uzupełniać tak samo jak tablice, a odczytuje się je za pomocą operatora kropki ".". Poniżej zaprezentowałem jak można zadeklarować strukturę i ją wywołać w funkcji.

#include <stdio.h>
#include <stdlib.h>
struct czlowiek {
 const char *nazwa;
 int wiek;
};
void wyswietl_wiek(struct czlowiek cz)
{
 printf("wiek czlowiek to: %i \n",cz.wiek);
}
int main(int argc, char *argv[]) {

 struct czlowiek albinos = {"Rysio",49};    
 wyswietl_wiek(albinos);
 return 0;
}

Jak można zauważyć na powyższym przykładzie trzeba ciągle powtarzać słowo struct, zarówno w definicji jak i deklaracji. Dlatego często spotykamy się z przypisaniem struktury do definicji. W takim przypadku deklaracja struktury jest bardziej intuicyjna. Poniżej zaprezentowałem ten sam przykład używając słowa typedef:

#include <stdio.h>
#include <stdlib.h>
typedef struct ludz {
 const char *nazwa;
 int wiek;
}czlowiek;
void wyswietl_wiek(czlowiek cz)
{
 printf("wiek czlowiek to: %i \n",cz.wiek);
}
int main(int argc, char *argv[]) {

 czlowiek albinos = {"Rysio",49};
 
 wyswietl_wiek(albinos);
 return 0;
}

Aby zmodyfikować strukturę wewnątrz funkcji należy przekazać adres do struktury, w ten sam sposób jak to pokazałem w artykule o wskaźnikach. Dzieje się tak dlatego, że przy przekazywaniu wartości tworzy się nowa kopia danej struktury, a po zamknięciu funkcji kopia zostaje usuwana i tylko przez wskaźnik można modyfikować dane. Kod modyfikacji zaprezentowałem poniżej:

#include <stdio.h>
#include <stdlib.h>
typedef struct ludz {
 const char *nazwa;
 int wiek;
}czlowiek;
void wyswietl_wiek(czlowiek cz)
{
 printf("wiek czlowiek to: %i \n",cz.wiek);
}
void urodziny(czlowiek *cz){
 //(*cz).wiek = (*cz).wiek +1;
 cz->wiek=cz->wiek+1;
 printf("dzis ma urodziny \n");
}
int main(int argc, char *argv[]) {

 czlowiek albinos = {"Rysio",49};
 
 wyswietl_wiek(albinos);
 urodziny(&albinos);
 wyswietl_wiek(albinos);
 return 0;
}

W powyższym kodzie zaprezentowałem zmianę wartości wiek za pomocą funkcji urodziny(). Jak można zauważyć w programie głównym przekazałem adres albinosa za pomocą urodziny(&albinos). W wewnątrz funkcji urodziny wiek został zwiększony o 1 używając takiego zapisu cz->wiek. Ten zapis jest równoważny z (*cz).wiek. Programiści byli zdenerwowani ciągłym pisaniem nawiasów,a bez tych nawiasów wskaźnik pokazywał nie na to co trzeba, dlatego wprowadzili operator "->".