Pointer Arithmetic
Jab pointer par p++ karte ho, wo memory mein 1 byte aage nahi badhta — wo apne TYPE ke size jitna aage badhta hai. Agar p ek int* hai (4 bytes), p++ karne se address 4 bytes aage jaata hai, taaki agla int element mile.
Ye C ko type-safe banata hai pointer navigation ke liye — tumhe khud byte-counting nahi karni padti, compiler apne aap sahi jagah tak le jaata hai type ke hisaab se.
Do pointers ko subtract kar sakte ho (kitne elements beech mein hain pata karne ke liye), lekin add nahi kar sakte (do addresses ko jodne ka koi meaning nahi hai).
int arr[5] = {10, 20, 30, 40, 50};
int *p = arr;
printf("%p\n", p); // jaise 0x1000
p++;
printf("%p\n", p); // 0x1004 (4 bytes aage, int ke liye)
printf("%d\n", *p); // 20
int *end = &arr[4];
printf("%ld\n", end - p); // 3 (kitne int elements beech mein hain)- p++ type ke size jitna aage badhta hai, na ki 1 byte
- Do pointers subtract kar sakte ho, add nahi
- Arithmetic type-aware hoti hai — compiler khud sahi jagah tak le jaata hai
C mein ek array ke "ek element aage" tak pointer le jaana valid hai (jaise loop conditions mein end pointer), lekin us position ko dereference karna undefined behavior hai. Isse "one past the end" rule kehte hain — bahut C libraries aur STL-jaisi patterns isi trick ka use karte hain.
Do alag arrays ke pointers ko subtract ya compare karna undefined behavior hai — sirf same array ke andar ke pointers ko meaningfully compare kar sakte ho.
int arr[5] = {1, 2, 3, 4, 5};
int *end = arr + 5; // VALID — ek position aage (dereference mat karo)
for (int *p = arr; p < end; p++) {
printf("%d ", *p); // classic pointer-based loop
}
// int *bad = arr + 100; // valid to create, dereference karna UB haiSame array ke andar pointers ko relational operators (<, >, <=, >=, ==) se compare kar sakte ho — ye batata hai kaun pointer memory mein pehle aata hai. Ye bahut common hai loop termination conditions mein (jaise upar ka example: p < end).
int arr[5] = {10, 20, 30, 40, 50};
int *p1 = &arr[1];
int *p2 = &arr[3];
if (p1 < p2) {
printf("p1 array mein pehle aata hai\n");
}
printf("%ld\n", p2 - p1); // 2 (kitne elements beech mein hain)