#include <stdio.h>int add(int a, int b); // 1. DECLARATION (prototype) — promiseint main(void) { int s = add(3, 4); // 2. CALL — compiler promise ke against check karta hai printf("%d\n", s); // 7 print karta hai return 0;}int add(int a, int b) { // 3. DEFINITION — promise pura karo return a + b;}
Recall Ek 12-saal ke bachche ko explain karo (Feynman)
Socho tumhare paas ek recipe machine hai. Pehle tum ek sign lagate ho jo kehta hai "ADD naam ki ek machine
hai jo do numbers leti hai aur ek wapas deti hai" — woh declaration hai. Baad mein tum actually machine
banate ho apne saare gears ke saath — woh definition hai. Jab tum ise use karte ho, tum apne real
cookies nahi dete; tum use apne numbers ki photocopies dete ho. Machine photocopies ke saath khelti hai,
tumhe ek result deti hai, aur ghar par tumhare real numbers bilkul waise hi hain jaise the. Woh photocopy rule
call by value kehlaata hai. Agar tum sach mein chahte ho ki machine tumhara ghar ka saman change kare, tum
use copy ki jagah apna ghar ka address (ek pointer) dete ho.
Single-pass compiler ko argument types aur return type pata hona chahiye call check karne aur arguments convert karne ke liye; warna woh guess karta hai (implicit int) aur bugs aate hain.
Call by value mein function ko kya pass hota hai?
Har argument ki value ki ek copy, jo parameter mein rakh di jaati hai (stack frame mein ek fresh local).
Normal swap(a,b)main mein a aur b kyun nahi change karta?
Woh local copies x aur y swap karta hai; originals alag memory hain aur untouched rehte hain.
C mein function caller ki variable modify kaise karta hai?
Address (&var) pass karo aur pointer parameter use karo; original edit karne ke liye dereference karo (*p).
Kya definition bhi declaration hai?
Haan — definition mein signature hai, isliye woh function declare bhi karta hai. Reverse true nahi hai.
Kya prototype mein parameter names zaroori hain?
Nahi — int add(int, int); valid hai; declarations mein names optional hain.
Call by value mein stack frame ka kya role hai?
Yeh ek call ke liye copied parameters aur locals hold karta hai; return par destroy ho jaata hai, isliye changes escape nahi hote.
Pointer pass karna — kya woh abhi bhi call by value hai?
Haan; address value copy hoti hai. Lekin kyunki woh original ki taraf point karta hai, dereference karne se real data edit hota hai.