Lesson 11 — Intermediate
Structures & Unions
Ek student ka naam (char), roll (int) aur marks (float) — teen alag type. Inhe ek jagah rakhne ka tarika hai structure. Is lesson mein hum struct banana, pointer ke saath access, typedef/enum, aur union ka "ek hi memory" wala khel dekhenge.
Structure kaise banta hai
WHAT
Structure alag-alag type ke data members ko ek naam ke under ek saath rakhta hai. Har member ki apni jagah (memory) hoti hai — sab alag-alag, par ek saath access.
WHEN
Jab ek record ke hisse alag type ke hon — student (name, roll, marks), account (id, balance), point (x, y). Ek variable mein poora record = clean code.
WHERE
Database jaise records, config data, function ek saath bahut values bhejne ke liye — aur aage DSA (linked list, tree) mein structure hi base hai.
#include <stdio.h>
#include <string.h>
struct Student {
char name[50];
int roll;
float marks;
};
int main() {
struct Student s1;
strcpy(s1.name, "Rahul");
s1.roll = 101;
s1.marks = 88.5;
printf("%s %d %.1f\n", s1.name, s1.roll, s1.marks);
return 0;
}
Output: Rahul 101 88.5
- Dot operator (s1.roll): direct member access.
- Declaration: struct Student s1; — C mein struct keyword dobara likhna zaroori hai (C++ mein nahi).
- Initialization: struct Student s1 = {"Rahul", 101, 88.5}; order member jaisa hona chahiye.
- Size: sab members ka size + padding (alignment) — sizeof se check karo.
Array of structs aur -> operator
#include <stdio.h>
struct Student { char name[20]; int roll; float marks; };
int main() {
struct Student cls[3] = {
{"Anu", 1, 90.0}, {"Raj", 2, 76.5}, {"Sia", 3, 85.0}
};
for (int i = 0; i < 3; i++)
printf("%s: %.1f\n", cls[i].name, cls[i].marks);
struct Student *p = &cls[0]; // pointer to struct
printf("Roll = %d\n", p->roll); // -> = pointer se member
return 0;
}
Output:
Anu: 90.0
Raj: 76.5
Sia: 85.0
Roll = 1
Array of structures hi asli duniya hai — class ki attendance list, bank ki account list, cricket scorecard. Har record ek struct, poora list ek array. DSA mein iska advanced roop linked list banega (size fixed nahi chahiye toh).
typedef aur enum — naam ki suvidha
#include <stdio.h>
typedef struct {
int x, y;
} Point; // Point ab struct ka alias hai
typedef unsigned long big; // big = unsigned long
enum Day { MON, TUE, WED }; // MON=0, TUE=1, WED=2
enum Color { RED = 1, GREEN = 5, BLUE }; // BLUE = 6 (agle se)
int main() {
Point p; p.x = 10; p.y = 20;
printf("(%d,%d)\n", p.x, p.y);
printf("%d %d %d\n", MON, TUE, WED);
printf("%d %d %d\n", RED, GREEN, BLUE);
return 0;
}
Output:
(10,20)
0 1 2
1 5 6
- typedef: existing type ko chhota/meaningful naam. struct ke saath sabse zyada — struct Student likhna nahi padta.
- enum: named integer constants. Default 0 se shuru; explicit de sakte ho; agla value = pichla + 1.
- Kahan enum: status codes, weekdays, menu options — int ki jagah padhne layak naam.
- typedef vs #define: typedef ko compiler samajhta hai (scope, type check), macro andha text replace hai.
Union — ek hi memory sabke liye
#include <stdio.h>
struct S { char a; int b; char c; };
union U { char a; int b; char c; };
int main() {
printf("struct = %zu\n", sizeof(struct S)); // 12 (alag + padding)
printf("union = %zu\n", sizeof(union U)); // 4 (sabse bada member)
union U u;
u.b = 65;
printf("%c %d\n", u.a, u.b); // A (int ka pehla byte = char)
return 0;
}
Output (typical):
struct = 12
union = 4
- Struct: har member ki ALAG memory — sab ek saath store.
- Union: sab members EK hi memory share — isliye size = sabse bada member.
- Ek time pe ek: union mein jo member last likha, wahi valid. Doosra likh pehla mita deta hai.
- Fayda: memory bachana — jab pata ho ek time pe ek hi type chahiye (variant data).
Exercise
Question: Structure ke POINTER se member access karne wala operator kaunsa hai? (. ya ->)
Question: Union mein members ki memory alag hoti hai ya shared (ek saath)?
Question: typedef ka kya kaam hota hai? (do shabd — naam/alias dena)
Question: enum { MON, TUE, WED }; mein MON ki default value kya hai? Sirf number daalo.
Common mistakes
- Pointer pe dot operator laga dena: struct *p = &s; mein s1.roll nahi, p->roll chahiye. Dot value ke liye, arrow pointer ke liye.
- Union members ko parallel samajhna: Union mein sab ek dusre ko overwrite karte hain — teeno ek saath valid nahi rehte (struct ki tarah nahi).
- Initialization ka order bhoolna: struct Student s = {101, "Rahul"} — galat. Order member declaration jaisa hona chahiye: {"Rahul", 101}.
Aadhar card pe naam, number, DOB — alag type ka data, par ek hi card. Wahi structure hai. Union tab jab ek card pe sirf ek info chhapni ho:
struct Aadhar {
char naam[30]; // Rahul
long number; // 1234
char dob[11]; // 01-01-2000
}; // teeno ek saath — struct
union Kyc { // KYC mein ek time pe ek:
long pan;
char passport[10];
}; // shared memory — size = bada wala- TCS NQT: struct output (. vs ->) + sizeof(union) — 1-2Q.
- GATE: struct vs union memory layout, padding, enum values.
- College exam: student record program (array of structs + display) — classic.
- Trap: "union sab members store kar sakta hai ek saath" — nahi, ek hi memory hai.
Structures clear. Agla lesson — File Handling — mein seekhenge data ko program ke bahar (disk pe) kaise rakhte hain.