Lesson 9 — Intermediate
Functions in C
Function code ka reusable block hai — ek baar likho, hazaar jagah bulao. Is lesson mein hum dekhenge function kaise banate hain, arguments kaise jaate hain (aur kyun original change nahi hota), recursion kya hai, aur static/local/global variables mein kya farak hai.
Function kaise banta hai — prototype aur definition
WHAT
Function ek named block hai jo ek kaam karta hai, chahe input le (parameters) ya na le, aur chahe value lautaye (return type) ya na lauta. Prototype compiler ko function ka signature pehle batata hai.
WHEN
Jab ek logic dobara-dobara aaye, jab code lamba ho jaaye, jab team mein baantna ho — turant function banao. Modular code = professional code.
WHERE
Har project mein. printf, strlen, main — sab functions hain. tumhare apne functions bhi isi tarah bante hain.
#include <stdio.h>
int add(int a, int b); // prototype (declaration)
int main() {
printf("%d\n", add(5, 3)); // 8
printf("%d\n", add(10, 20)); // 30
return 0;
}
int add(int a, int b) { // definition
return a + b;
}
Output:
8
30
- Return type: int, float, void (kuch nahi lauta), char — function ke baad ka type.
- Parameters: (int a, int b) — input. Call ke waqt asli values (arguments) jaati hain.
- Prototype: definition se pehle likho — compiler ko pehle se pata chal jaata hai, warna implicit declaration warning (C99 se error).
- Ek hi main: lekin functions kitne bhi — same file ya doosri file (link karte waqt jodna).
Pass by value — copy hi jaati hai
#include <stdio.h>
void show(int x) {
x = 100; // sirf LOCAL copy badli
}
int main() {
int a = 10;
show(a);
printf("a = %d\n", a); // a = 10 (change nahi hua!)
return 0;
}
Output: a = 10
C mein arguments pass by value hain — function ko asli variable nahi, uski copy milti hai. Function apni copy pe chahe kare, bahar wali variable jaisi thi waisi hi rehti hai.
// Value lautani ho — return use karo
int max(int a, int b) {
return (a > b) ? a : b;
}
int main() {
int m = max(10, 30); // 30 assign ho gaya
printf("%d\n", m);
}
// Output: 30
Recursion — function khud ko bulaye
#include <stdio.h>
int fact(int n) {
if (n == 0) return 1; // base case — yahan rukna hai
return n * fact(n - 1); // khud ko bulaya
}
int fib(int n) {
if (n <= 1) return n; // fib(0)=0, fib(1)=1
return fib(n - 1) + fib(n - 2);
}
int main() {
printf("fact(5) = %d\n", fact(5)); // 120
printf("fib(6) = %d\n", fib(6)); // 8
return 0;
}
Output:
fact(5) = 120
fib(6) = 8
fact(5) = 5 × fact(4) = 5 × 4 × fact(3) ... = 5 × 4 × 3 × 2 × 1 × 1 = 120. Har call apna frame stack pe rakhta hai — isliye base case ke bina stack overflow.
- Do zaroori cheezein: base case (rukne ki shart) + recursive case (chhoti problem pe call).
- Fibonacci tree: fib(6) ke liye bahut saare dohra calls — O(2^n) = dheema. Memoization/iteration se behtar hota hai.
- Fayda: tree, sorting, divide-and-conquer problems recursion mein aasaan likhe jaate hain.
Scope — local, global aur static
#include <stdio.h>
int count = 0; // GLOBAL — poori file mein
void counter(void) {
static int s = 0; // STATIC — ek baar init, phir yaad
s++;
count++;
printf("static=%d global=%d\n", s, count);
}
int main() {
counter(); // static=1 global=1
counter(); // static=2 global=2
counter(); // static=3 global=3
return 0;
}
- Local: function ke andar — call khatam, value gayi. Sabse safe.
- Global: file ke top pe — sab functions dekh sakte hain. Zyada use = code mushkil debug (koi bhi badal deta hai).
- Static: local dikhata hai par function calls ke beech VALUE YAAD rakhta hai (ek baar init hoti hai).
- Shadowing: local aur global ka naam same ho toh function ke andar wala jeet-ta hai — confusion ka source.
Exercise
Question: Function ka prototype function ki definition se PEHLE kyun likha jaata hai? (do words — compiler ko pehle)
Question: fact(5) kitna return karta hai? Sirf number daalo.
Question: C mein arguments kaise pass hote hain — by value ya by reference?
Question: Recursion mein infinite call se bachne wali shart ka naam? (base case / else)
Common mistakes
- Function ke andar original variable badalne ki koshish: Pass by value hai — copy milti hai. Change chahiye toh pointer bhejo (&x) ya return karwao.
- Base case bhool jaana recursion mein: Base case nahi toh call stack badhta hi jaayega = stack overflow = program crash. Pehle rukne ki shart likho.
- Prototype aur definition ka signature alag rakhna: Prototype mein int add(int, int) aur definition mein float add(float...) = link error/undefined behaviour. Dono match karne chahiye.
Dukaan ka counter roz zero nahi hota — din bhar chalta rehta hai. Static variable bhi yahi karta hai: ek baar shuru, phir har call pe yaad:
#include <stdio.h>
void bill(void) {
static int total = 0; // memory mein bana rehta hai
total += 50;
printf("Bill total = %d\n", total);
}
int main() {
bill(); // Bill total = 50
bill(); // Bill total = 100
bill(); // Bill total = 150
return 0;
}- TCS NQT: recursion output (fact/fib) + pass by value concept — 1-2Q.
- GATE: call stack, static vs auto storage, recursion depth.
- College exam: recursion se factorial/reverse number program likhwana.
- Trap: "C pass by reference deta hai" — nahi, sirf pointer se emulate karte hain.
Functions clear. Agla lesson — Pointers — C ka sabse powerful (aur feared) topic, jahan memory ka asli khel hota hai.