// struct definition and declaration struct a { int a; int b; } c; // Useless, but legal struct declaration struct { int x; }; // Useful anonymous struct declaration struct { int y; } anon1, anon2; // forward declarations struct a; struct b; struct c; struct b {int a; int b; }; // struct c {b g; }; // syntax error. // struct s {float c,a,b,c;} s; // duplicate struct member struct c {struct b g; }; // struct a { int w; }; // error void testCopying() { struct a {int a[10]; char c;} a, b; a.c = 37; b.c = 38; b = a; printf("testCopying: %d == %d\n", a.c, b.c); } void testUnion() { union u; union u {float f;int i;} u; u.f = 1.0f; printf("testUnion: %g == 0x%08x\n", u.f, u.i); } struct v {float x, y, z, w; }; void add(struct v* result, struct v* a, struct v* b) { result->x = a->x + b->x; result->y = a->y + b->y; result->z = a->z + b->z; result->w = a->w + b->w; } void set(struct v* v, float x, float y, float z, float w) { v->x = x; v->y = y; v->z = z; v->w = w; } void print(struct v* v) { printf("(%g, %g, %g, %g)\n", v->x, v->y, v->z, v->w); } void testArgs() { struct v a, b, c; set(&a, 1.0f, 2.0f, 3.0f, 4.0f); set(&b, 5.0f, 6.0f, 7.0f, 8.0f); add(&c, &a, &b); printf("testArgs: "); print(&c); } int main() { anon1.y = 3; anon2.y = anon1.y; testCopying(); testUnion(); testArgs(); struct c cc; cc.g.a = 3; c.a = 1; c.b = 3; struct a {int x, y; } z; // struct a {int x, y; } z2; z.x = c.a; struct a *pA; pA = &z; pA->x += 5; return pA->x; }