Neautentificat.
M-am gandit sa scriu si un Index la aceasta lectie, ca sa stiti cam ce va asteapta ![]()
I. Conceptul de structura
II. Declararea unei structuri
III. Declararea variabilelor de tip structura
IV. Operatori pentru structuri
V. Un programel care foloseste ce am invatat in aceasta lectie
VI. Epilog ![]()
I.Conceptul de structura
Ca o introducere, ar trebui oarecum definit conceptul de structura in C
Structura = O colectie de valori.
Proprietati ale structurii :
- nu poate contine functii
- nu poate contine variabile de tip void
II.Declararea unei structuri
-se face prin intermediul cuvantului cheie struct ( cuvant cheie = cuvant rezervat )
Forma generala
struct <nume_structura> {
//declaratii de variabile;
tip_variabila1 <nume_variabila1> ;
//..................................................
tip_variabilaN <nume_variabilaN>;
} declarare_structura;
Deci, am invatat forma generala a structurii. Acum cateva observatii privind componentele acesteia:
a)declarare_structura - apartine declaratiei unei variabile de tip structura , vom vorbi imediat si despre aceasta:).
b)<nume_structura> si declarare_structura sunt componente optionale,dar nu simultan. Deci sau lipseste prima componenta sau ultima. Desigur, fiind optionale, exista si cazul in care ambele componente sunt prezente ![]()
c)La declararea structurii nu putem initializa nici o variabila din aceasta.
d) Componenta tip_variabila poate fi orice tip existent in C , chiar si struct, exceptie facand void .
Un exemplu in care declaram o structura
struct persoana {
int varsta;
char nume[30],prenume[30],ocupatie[30];
}l
III.Declararea variabilelor de tip structura
Variabilele de tip structura pot fi instante ale unei structuri sau pointeri catre o structura. Nu incep sa explic decat partea cu instantele unei structuri. Pointerii sunt acoperiti in alta lectie .
Forma generala
nume_structura <nume_variabila>;
Componenta declarare_structura este echivalentul declararii unei variabile de tip structura.Daca doar aceasta componenta este prezenta ,si nume_structura nu exista, structura este unica, si nu se pot creea instante ale acesteia.
Exemplu pentru structura definita mai sus
persoana var; // am definit o variabila var de tip persoana = instanta a structurii persoana
IV.Operatori pentru structuri
a) Accesarea unui camp dintr-o structura
- se face prin intermediul operatorului "." ( punct)
Exemplu :
//Considerand variabila var de tip persoana ,putem accesa urmatoarele campuri
var.varsta // tip int
var.nume //tip char
var.prenume // tip char
var.ocupatie // tip char
Code Example :
printf(" Nume si prenume : ");
scanf("%s %s", &var.nume,&var.prenume);
printf("Your full name is %s %s.\n",var.nume,var.prenume);
b) operatorul & ( vezi exemplu deasupra )
c) operatorul sizeof - returneaza marimea in bytes a structurii
Exemplu
printf("%d \n",sizeof(var)); // suma marimilor in memorie a campurilor acestei structuri
V. Un programel care foloseste ce am invatat in aceasta lectie
#include <stdio.h>
struct persoana{
struct {
int zi,luna,an;
}data_nasterii;
struct {
char nume[30],prenume[30];
}name;
char ocupatie[50];
};
persoana Record;
int main(){
printf("Inregistrare persoana\n");
printf("Nume si prenume : ");
scanf("%s %s",&Record.name.nume,&Record.name.prenume);
printf("Data nasterii\n");
printf(" Zi : ");scanf("%d",&Record.data_nasterii.zi);
printf(" Luna :");scanf("%d",&Record.data_nasterii.luna);
printf(" An : ");scanf("%d",&Record.data_nasterii.an);
printf("Ocupatie : ");
scanf("%s",&Record.ocupatie);
write_record(Record); // functie care afiseaza continutul variabilei Record de tip structura
return 0;
}Daca ati citit lectia, ar trebui sa stiti ce face codul
.
VI. Epilog
Da. Deci epilog , deci The End, Game over . ![]()
Sper ca a fost oarecum utila lectia. Ma astept la critici, chiar as fi bucuros sa ma completati sau sa ma corectati
Cheers
Editat ultima oară de redkar23 (27 Mar 08 18:08)

Offline
Cateva lucruri care merita adaugate:
- o structura poate contine pointeri la functii
- compilatorul poate introduce padding in interiorul structurii pentru a se asigura ca membrii structurii sunt aliniati
- pentru a afla usor offsetul in bytes al unui membru in cadrul structurii se poate folosi macroul "offsetof" declarat in stddef.h
Exemplu:
#include <stdio.h>
#include <stddef.h>
struct my_struct
{
char x;
int y;
short z;
long t;
};
int main()
{
struct my_struct str1 = {'a', 1, 2, 3L};
printf("Offset of field x in struct str1 is %x bytes\n", offsetof(struct my_struct, x));
printf("Offset of field y in struct str1 is %x bytes\n", offsetof(struct my_struct, y));
printf("Offset of field z in struct str1 is %x bytes\n", offsetof(struct my_struct, z));
printf("Offset of field t in struct str1 is %x bytes\n", offsetof(struct my_struct, t));
return 1;
}Output-ul pe calculatorul meu (linux x86-64):
Offset of field x in struct str1 is 0 bytes
Offset of field y in struct str1 is 4 bytes
Offset of field z in struct str1 is 8 bytes
Offset of field t in struct str1 is 10 bytes
Precum se observa, offset-ul lui x este 0, evident pentru ca e primul membru al structurii (adresa primului membru al unei structuri e identica cu adresa structurii)
Offset-ul lui y este 4 bytes. Precum se observa, compilatorul a introdus un padding de 3 bytes dupa membrul x pentru a alinia adresa lui y la 4 bytes (pentru ca sizeof(int) = 4 pe masina mea)
Offset-urile lui z si t sunt evidente ...
Editat ultima oară de astan (28 Mar 08 00:59)
Offline
Mersi de completari
Intotdeauna cad bine informatii noi ![]()
Cheers

Offline