Pointers & Arrays
Array ka naam, jab kisi expression mein use hota hai, "decay" hoke pehle element ke pointer mein badal jaata hai. arr aur &arr[0] same address dete hain.
Isi wajah se array ko pointer arithmetic se bhi access kar sakte ho: arr[i] aur *(arr + i) exactly same cheez hain — compiler dono ko same machine code mein convert karta hai.
Farq bhi hai: pointer ko reassign kar sakte ho (p = someOtherAddress), array ke naam ko nahi — array khud ek "constant pointer" jaisa hai jiski memory location fix hoti hai.
int arr[3] = {10, 20, 30};
int *p = arr; // array name = pointer to first element (no & needed!)
printf("%d\n", arr[1]); // 20
printf("%d\n", *(p + 1)); // 20 — same thing!
printf("%d\n", *(arr + 1)); // 20 — array bhi pointer arithmetic support karta hai- Array ka naam decay hoke pointer ban jaata hai
- arr[i] aur *(arr+i) same cheez hain
- Array name reassign nahi ho sakta, pointer ho sakta hai
int *p aur int (*p)[5] bilkul alag cheezein hain — pehla ek int ka pointer hai (array decay hone ke baad first element ko point karta hai), doosra poore 5-element array ka pointer hai. Dono ko increment karne se bilkul alag results milte hain.
p++ (jaha p int* hai) 4 bytes (ek int) aage badhta hai. p++ (jaha p int(*)[5] hai) 20 bytes (poora array, 5 ints) aage badhta hai — ye interview mein aksar confuse karne ke liye pucha jaata hai.
int arr[5] = {1, 2, 3, 4, 5};
int *p1 = arr; // pointer to int (first element)
int (*p2)[5] = &arr; // pointer to the whole array
printf("%p\n", p1);
printf("%p\n", p1 + 1); // 4 bytes aage
printf("%p\n", p2);
printf("%p\n", p2 + 1); // 20 bytes aage (poora array skip)Jab array function mein pass karte ho, C ACTUALLY poora array copy nahi karta — sirf uska decayed pointer (first element ka address) pass hota hai. Isliye function signature mein void f(int arr[10]) aur void f(int *arr) exactly same cheez hain — compiler dono ko same treat karta hai.
Isi wajah se function ke andar sizeof(arr) galat answer deta hai (sirf pointer ka size, jaise 8 bytes) — array ka asli size function ko nahi pata, isliye size hamesha separately parameter ke roop mein pass karna padta hai.
// Ye teeno signatures EXACTLY same hain compiler ke liye:
void f1(int arr[10]) { }
void f2(int arr[]) { }
void f3(int *arr) { }
void printSize(int arr[]) {
printf("%lu\n", sizeof(arr)); // 8 (pointer size), NA ki poore array ka size!
}