5.1.10 · HinglishC Programming

Arrays and pointers — array name decays to pointer

1,557 words7 min readRead in English

5.1.10 · Coding › C Programming


WHAT is "decay"?

Teen famous exceptions jahan decay NAHI hoti (naam poori array rehti hai):

  1. ==sizeof arr== → poori array ke total bytes deta hai, pointer size nahi.
  2. ==&arr== → T(*)[N] deta hai, poori array ka pointer, T** nahi.
  3. String literal jo char[] ko initialize karne ke liye use hota hai (wahan woh array hi rehta hai).

WHY does C do this?


HOW does indexing actually work? (derive from scratch)

Hum claim karte hain ki arr[i] ko *(arr + i) ke roop mein define kiya gaya hai. Ise build karte hain.

Step 1 — arr + i mein arr kya hai? Yeh step kyun? Expression arr + i mein, arr ek value ke roop mein use ho raha hai → yeh decay ho ke &arr[0] ban jaata hai, type T*.

Step 2 — Pointer arithmetic element size ke hisaab se scale hoti hai. Yeh step kyun? T* mein i add karna i bytes add nahi karta; yeh i elements add karta hai. Compiler ko sizeof(T) pata hota hai, isliye:

Step 3 — Dereference. Yeh step kyun? *(arr + i) us computed address pe stored T ko read karta hai — exactly -vaan element.

Toh C standard ke according:

Figure — Arrays and pointers — array name decays to pointer

Worked Examples


Common Mistakes (Steel-man)


Flashcards

"Array decays to pointer" ka matlab kya hai?
Zyaadatar expressions mein array name T[N] automatically T* mein convert ho jaata hai jo &arr[0] ke barabar hota hai.
Woh 3 contexts kaun se hain jahan array decay NAHI hoti?
sizeof arr, &arr, aur ek string literal jo char[] initialize karta hai.
C mein arr[i] ko kya define kiya gaya hai?
*(arr + i) — pure pointer arithmetic.
3[arr] compile kyun hota hai aur arr[3] ke barabar kyun hai?
Kyunki arr[i] == *(arr+i) == *(i+arr) == i[arr]; addition commutative hai.
void f(int arr[]) ke andar arr ki real type kya hai?
int * — parameter array syntax pointer mein rewrite ho jaata hai; size info kho jaati hai.
int a[10] ke liye sizeof(a)? Aur int *p=a ke liye sizeof(p)?
40 (10×4, no decay) aur 8 (pointer width).
int arr[5] ke liye arr vs &arr ki type?
int* vs int(*)[5].
p vs &arr ke liye pointer +1 alag byte-distances kyun move karta hai?
Yeh pointed-to type ki size se scale hota hai: int* ke liye 4 bytes vs int(*)[5] ke liye 20 bytes.
Kya tum arr = p; likh sakte ho? Kya tum p = arr; likh sakte ho?
Nahi (array name ek lvalue nahi hai jise assign kar sako) ; Haan (pointer reassign theek hai).

Recall Feynman: explain to a 12-year-old

Imagine karo ek platform pe khadi 10 bogion wali train. Train ke side pe painted naam bas yeh batata hai "is train ka agla hissa yahaan hai." Jab tum apne dost ko train ka naam bata ke describe karte ho, tum actually sirf woh jagah point kar rahe ho jahan se woh shuru hoti hai — woh wahaan se bogiyaan ginta hua chal sakta hai. Yahi "front ko point karna" decay hai: naam arrow ban jaata hai jo box #0 ki taraf point karta hai. Lekin agar tum poochho "poori train kitni lambi hai?" (sizeof), toh station ka map jaanta hai ki woh 10 bogiyaan hain — yeh khaas sawaal arrow se bewakoof nahi hota.


Connections

  • Pointer Arithmetic — decay ki wajah se hi arr+i kaam karta hai.
  • Passing Arrays to Functions — decay ka practical fallout.
  • sizeof Operator — decay ka #1 exception.
  • Multidimensional Arrays — decay sirf outermost dimension ko peel karta hai (int[3][4]int(*)[4]).
  • Strings in Cchar* vs char[] aur literal decay.
  • Memory Layout and Addresses — contiguous boxes yeh sab underlie karte hain.

Concept Map

decays in most expressions

yields

has value

defined as

uses

equivalent to

allows

enables cheap

but not in

includes

includes

Array name T at N

Decay conversion

Pointer to first element T*

Value equals &arr 0

arr i indexing

Pointer arithmetic scales by sizeof T

Addition is commutative

i arr equals arr i

Arrays passed by reference

Exceptions block decay

sizeof arr gives whole array bytes

&arr gives pointer to whole array