5.1.26 · D2 · HinglishC Programming

Visual walkthroughTypedef

1,773 words8 min read↑ Read in English

5.1.26 · D2 · Coding › C Programming › Typedef


Step 1 — Ek plain declaration asal mein kya kehti hai

KYA. C ki sabse simple possible line se shuru karte hain:

int x;

YAHAAN SE KYUN SHURU KAREIN. typedef bilkul isi shape ko copy karta hai. Agar hum samajh lein ki aankh aur compiler ek variable declaration ko kaise padhte hain, toh hume typedef free mein mil jaata hai — kyunki typedef literally yahi line hai jisme ek word aage jod diya gaya hai.

PICTURE. C mein ek declaration ke do kaam hote hain jo do jagahon pe pin hote hain. Left pe hota hai base type (int). Middle mein hota hai naam jo introduce ho raha hai (x). Isse ek sentence ki tarah padho:

  • int — cheez ki qisam.
  • x — woh label jisse hum us qisam ki cheez ko refer kar sakte hain.
Figure — Typedef

Step 2 — Aage typedef jod do

KYA. Usi line ke aage keyword typedef lagao:

typedef int Integer;

KYUN. C designers ne ek jaanbujhkar choice ki: aliases ke liye bilkul naya syntax invent karne ki bajaye, unhone wahi declaration syntax reuse kiya jo aap jaante the. Unka add kiya hua ek hi rule hai — ek meaning ka flip, jo aage dikhega.

PICTURE. Har cheez Step 1 jaisi hi lagti hai, sirf ek word dum left mein aa gaya hai:

  • typedef — ek switch. Yeh compiler ko kehta hai: "variable mat banao; balki, name slot mein jo bhi naam baitha hai woh ek type ka naya naam ban jaata hai."
  • int — abhi bhi base type hai.
  • Integername slot mein baitha hai. Toh Integer ab int ka alias hai.
Figure — Typedef

Step 3 — * naam ke saath kyun chipakta hai, type ke saath nahin

KYA. Ab ek pointer wali line:

char *String;   // without typedef

KYUN YEH MATTER KARTA HAI. Yeh C declarations ki sabse tricky cheez hai, aur saari "pointer typedef surprise" isi se aati hai. Koi bhi pointer alias trust karne se pehle hume yeh dekhna padega ki * kahan bind karta hai.

PICTURE. * base type char ka hissa nahin hai. Yeh naam String ke saath juda hai. Declaration ko is tarah padho: "*String ek char hai", yaani "jab String ko dereference karo toh char milta hai", yaani String ek pointer-to-char hai.

  • char — base type (jo pointer follow karne ke baad milta hai).
  • * — naam ke saath bind hota hai, matlab "pointer to..."।
  • String — naam.
Figure — Typedef

Step 4 — Pointer line mein typedef add karo

KYA.

typedef char *String;

KYUN. Steps 2 aur 3 ko saath apply karo. typedef aage lagao; name slot ka identifier String hai; us identifier ka type kya hota — "pointer to char". Toh String char * ka alias ban jaata hai.

PICTURE. Step 3 jaisa hi layout, bas switch flip ho gaya:

Kyunki * Step 3 mein alias ke andar bake tha, ab yeh us type ka hissa hai jisko String naam karta hai. Yahi Step 5 ki famous surprise ka beej hai.

Figure — Typedef

Step 5 — Multi-name surprise (edge case)

KYA. Pointer alias ke saath aur raw * ke saath do naam declare karo:

typedef int* IntPtr;
IntPtr  a, b;   // a: int*   b: int*   (DONO pointers)
 
int*    c, d;   // c: int*   d: int    (sirf c!)

KYUN DIKHAYEIN. Yeh woh degenerate case hai jahan beginners burn hote hain. Hume prove karna hai ki results alag kyun hote hain — aur jawab poora Step 3 se aata hai.

PICTURE. int* c, d; mein * sirf pehle naam (c) ke saath bind hota hai; d sirf base type int reuse karta hai. Lekin IntPtr ek poora type hai — * already uske andar hai — toh list mein har naam complete pointer type inherit karta hai.

  • upar wali line: arrow dikhata hai * sirf c tak pahunch raha hai.
  • neeche wali line: koi loose * nahin hai — pointerness IntPtr ke andar rehti hai, toh a aur b dono full pointers hain.
Figure — Typedef

Step 6 — struct case: ek keyword hataana

KYA.

struct Point { int x, y; };
typedef struct Point Point;   // 'struct Point' ke liye alias 'Point'
Point p;                      // 'struct Point p;' ki jagah

KYUN. C mein, struct tags ek alag namespace mein rehte hain, isliye poora type naam do words ka hota hai: struct Point. Apna rule apply karo: typedef hatao → struct Point Point; ek variable Point declare karta hai jo struct Point type ka hai. Toh alias Point ab struct Point matlab hai, aur hum keyword hamesha ke liye drop kar sakte hain.

PICTURE. Do namespaces side by side baithte hain; typedef plain naam Point (type namespace) se tagged type struct Point tak ek bridge banata hai.

Figure — Typedef

Step 7 — Boss level: ek function-pointer typedef

KYA. Sabse common ugly form decode karo:

typedef int (*Operation)(int, int);

KYUN. Function-pointer syntax sabko darrata hai. Lekin hamara rule abhi bhi kaam karta hai — name slot beech mein daба hua hai, aur use dhundhna hi poora khel hai. Dekho Function Pointers.

PICTURE. typedef hatao, phir name slot dhundho. Parentheses (*Operation) * ko naam ke saath group karte hain (forcing "pointer to function", "function returning pointer" nahin). Naam se baahir ki taraf padhne par:

  • Operation — name slot ⇒ yahi alias banta hai.
  • (* ... ) — pointer, parenthesise isliye kiya taaki call parens se pehle bind ho.
  • (int, int) — function ke parameters.
  • int (dum left) — function ka return type.

Toh Operation = "ek function ka pointer jo do ints leta hai aur int return karta hai." Usage:

int add(int a, int b){ return a + b; }
Operation op = add;
int r = op(2, 3);   // r = 5
Figure — Typedef

Ek-picture summary

KYA. Ek flow jo har step compress karta hai: typedef dhako, variable declaration ki tarah padho, name slot tumhara alias hai, us naam ka jo bhi type hota woh alias ki meaning hai — aur * hamesha naam ke saath sawaar rehta hai.

Figure — Typedef

cover the word typedef

find the identifier being declared

the name slot becomes

the type that variable would have had

asterisk rides with the name

so a list of names

Any typedef line

Read as a variable declaration

Name slot found

The new type alias

Meaning of the alias

Pointerness baked into alias

All names get the full type

Recall Feynman: poora walkthrough apne shabdon mein batao

C ki ek normal line, jaise int x;, ke do slots hote hain: left pe ek type aur beech mein kahin ek naam. Us beech wale slot ke aage jadu ka word typedef lagao aur ek switch flip ho jaata hai: woh beech wala naam ab ek variable nahin hai — woh ek type ka naya naam ban jaata hai, aur jis type ka woh hota uska wahi matlab hai ab us naam ka. Sabse tricky hissa woh chhota sa star * hai: yeh hamesha naam ke saath chipakta hai, base type ke saath nahin. Isi liye typedef int* IntPtr; mein IntPtr a, b; se do pointers milte hain, jabki int* a, b; mein sirf ek milta hai. Structs ko do words chahiye (struct Point), toh ek typedef ek-word naam ki taraf bridge banata hai. Aur daraawni function-pointer form bhi bilkul usi rule ka paalan karti hai: dabba hua naam nikalo, aur wahi naam tumhara alias hai. Ek trick, har case.


Connections