Teste seu entendimento sobre inicialização de struct, atribuição, operador seta e vetores de structs.
struct Point { int x; int y; }; struct Point p = {3, 7}; printf("(%d, %d)\n", p.x, p.y);
struct Point a = {1, 2}; struct Point b; b = a; b.x = 10; printf("a.x=%d, b.x=%d\n", a.x, b.x);
b se torna uma cópia independente de a, então mudar b.x não afeta a.x.struct Point p = {5, 8}; struct Point *ptr = &p; printf("%d\n", ptr->y);
ptr->y é uma forma curta de (*ptr).y. Use o operador seta para acessar membros através de um ponteiro. p.y = 8.struct Student { char name[20]; int score; }; struct Student s[3] = { {"Taro", 80}, {"Hanako", 95}, {"Jiro", 70} }; int max = 0; for (int i = 0; i < 3; i++) { if (s[i].score > s[max].score) max = i; } printf("%s\n", s[max].name);
s[1].score=95 é a maior, então max=1 e s[1].name = "Hanako".typedef struct { int x; int y; } Point; Point p = {3, 4}; printf("%d\n", p.x + p.y);
typedef struct { ... } Point; dá à struct o apelido Point.
Point p; sem a palavra-chave structtypedef deixa o código mais legível e é comum em projetos maiores.
struct Point { int x; int y; }; struct Line { struct Point start; struct Point end; }; struct Line l = {{0, 0}, {3, 4}}; printf("%d\n", l.end.x);
l.end é {3, 4} (uma struct Point)// Ambiente 64-bit típico (int=4, char=1, alinhamento=4) struct S { char c; int i; }; printf("%lu\n", sizeof(struct S));
int tipicamente precisa ficar numa fronteira de 4 bytes, então padding é inserido depois de cstruct Point { int x; int y; }; void reset(struct Point p) { p.x = 0; p.y = 0; } int main(void) { struct Point pt = {5, 10}; reset(pt); printf("%d %d\n", pt.x, pt.y); return 0; }
p é uma cópia de ptpt do chamadorpt permanece 5 10void reset(struct Point *p)) e use p->x = 0;. Passar por ponteiro também é uma boa forma de evitar custo de cópia em structs grandes.
struct Point { int x; int y; int z; }; struct Point p = {5}; printf("%d %d %d\n", p.x, p.y, p.z);
struct Point p = {0}; inicializa todos os membros com zero. Com os designated initializers do C99, você também pode inicializar apenas membros específicos: {.x = 5}.