Arrays and Pointers
Arrays और pointers: संबंध
Arrays और pointers C के सबसे महत्वपूर्ण — और सबसे उलझाने वाले — topics में से हैं, मुख्यतः इसलिए कि ये आपस में बहुत जुड़े हैं। जब आप ठीक-ठीक देख लेते हैं कि ये कैसे जुड़ते हैं, तो C का बहुत कुछ अचानक समझ आ जाता है: array indexing, functions को array भेजना, और strings — सब इसी संबंध पर टिके हैं।
मूल बात सरल है: array का नाम अपने पहले element के pointer की तरह व्यवहार करता है। यह एक वाक्य समझ लिया तो बाकी lesson बस इसे काम करते देखना है। (अगर pointers नए हैं तो पहले C में pointers पढ़ें।)
Array name address क्यों है
जब आप array का नाम अकेले लिखते हैं, तो C आपको उसके पहले element का address देता है। यानी a और &a[0] एक ही address हैं।
#include <stdio.h>
int main() {
int a[] = {10, 20, 30};
printf("a = %p\n", a);
printf("&a[0] = %p\n", &a[0]); // वही address
printf("Pehli value = %d\n", *a); // a को dereference
return 0;
}a = 0x7ffee4a2c0
&a[0] = 0x7ffee4a2c0
Pehli value = 10
क्योंकि a पहले element का address है, इसे *a से dereference करने पर 10 मिलता है — पहली value।
Array पर pointer arithmetic
यहाँ चतुराई वाला हिस्सा है। जब आप pointer में 1 जोड़ते हैं, तो C 1 byte नहीं, बल्कि एक element आगे बढ़ता है। तो int array के लिए a + 1 एक int के size जितना आगे कूदकर अगले element पर पहुँचता है।
#include <stdio.h>
int main() {
int a[] = {10, 20, 30};
int *p = a; // p, a[0] को point करता है
printf("%d\n", *p); // 10 (a[0])
printf("%d\n", *(p + 1)); // 20 (a[1])
printf("%d\n", *(a + 2)); // 30 (a[2])
return 0;
}10
20
30
ध्यान दें हमने p और a दोनों के साथ + इस्तेमाल किया — ये एक जैसे काम करते हैं क्योंकि दोनों पहले element के address हैं।
a[i] वही है जो *(a+i)
यह C की सबसे महत्वपूर्ण पहचानों में से एक है। जो square-bracket notation आप पहले से जानते हैं, वह बस shorthand है:
| आप लिखते हैं | C इसे मानता है |
|---|---|
a[0] | *(a + 0) |
a[1] | *(a + 1) |
a[i] | *(a + i) |
क्योंकि a[i] का मतलब *(a+i) है, और जोड़ commutative होता है, इसलिए i[a] भी चलता है और वही value देता है! अजीब लगता है पर यह valid C है।
Pointer से array में घूमना
आप pointer को एक बार में एक element आगे बढ़ाकर पूरे array में घूम सकते हैं।
#include <stdio.h>
int main() {
int a[] = {10, 20, 30, 40, 50};
int n = 5;
int *p = a;
for (int i = 0; i < n; i++) {
printf("%d ", *p); // current element पढ़ें
p++; // अगले element पर जाएँ
}
return 0;
}10 20 30 40 50
हर p++ pointer को एक int आगे बढ़ाता है, इसलिए वह हर element को क्रम से देखता है। यही पर्दे के पीछे होता है जब आप loop में a[i] इस्तेमाल करते हैं।
पर array pointer नहीं है
यहीं कई students फँसते हैं। भले ही array name expressions में pointer की तरह काम करता हो, ये असल में अलग चीज़ें हैं। दो सबूत:
#include <stdio.h>
int main() {
int a[] = {10, 20, 30};
int *p = a;
printf("sizeof(a) = %lu\n", sizeof(a)); // 12 (3 ints)
printf("sizeof(p) = %lu\n", sizeof(p)); // 8 (sirf pointer)
// a = p; // ERROR: array name reassign nahi hota
p = a + 1; // OK: pointer reassign ho sakta hai
printf("Ab p point karta hai %d\n", *p); // 20
return 0;
}sizeof(a) = 12
sizeof(p) = 8
Ab p point karta hai 20
Array memory का fixed block है — उसके नाम को कहीं और point नहीं करा सकते। Pointer एक variable है जिसे reassign कर सकते हैं। Array name सिर्फ़ expressions में pointer में decay होता है।
आम गलतियाँ
- यह सोचना कि
p + 1एक byte आगे बढ़ता है — यह एक element आगे बढ़ता है। - Array name reassign करने की कोशिश (
a = something) — allowed नहीं। - Pointer पर
sizeofसे array size की उम्मीद — यह pointer size देता है। - Pointer arithmetic से आख़िरी element के आगे पढ़ना — यह out-of-bounds और असुरक्षित है।
5 integers का array लें और उन्हें दो बार print करें: एक बार a[i] से, एक बार *(a+i) से। पुष्टि करें कि दोनों loop एक जैसा output देते हैं — साबित करता है कि दोनों notation एक हैं।
सारांश
- Array name पहले element का address देता है, इसलिए pointer की तरह काम करता है।
- Pointer arithmetic element-size कदमों में चलता है, इसलिए
a+1अगला element है। a[i]की परिभाषा*(a+i)है — एक ही चीज़।- Pointer को
p++से बढ़ाकर array में घूम सकते हैं। - फिर भी array pointer नहीं है:
sizeofअलग है और array name reassign नहीं होता।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
क्या C में array और pointer एक ही हैं?
a[i] और *(a+i) एक जैसे क्यों काम करते हैं?
a[i] की परिभाषा ही *(a + i) है। Array name शुरुआती address देता है, i जोड़ने से i elements आगे बढ़ते हैं, और * वहाँ की value पढ़ता है। दोनों notation एक ही चीज़ में compile होते हैं।Arrays के संदर्भ में pointer arithmetic क्या है?
p + 1 अगले element को इशारा करता है, अगले byte को नहीं। यही pointer से array में घूमना संभव बनाता है।मैं array name को a = p की तरह assign क्यों नहीं कर सकता?
क्या sizeof array और pointer के लिए एक ही result देता है?
sizeof(array) सभी elements का कुल size देता है, जबकि sizeof(pointer) सिर्फ़ pointer का अपना size (आमतौर पर 8 bytes) देता है। यह साबित करता है कि array और pointer अलग तरह से store होते हैं।