📘 Lesson  ·  Lesson 56

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 हैं।

C Language
#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;
}
Output:
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 पर पहुँचता है।

C Language
#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;
}
Output:
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 में घूम सकते हैं।

C Language
#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;
}
Output:
10 20 30 40 50

हर p++ pointer को एक int आगे बढ़ाता है, इसलिए वह हर element को क्रम से देखता है। यही पर्दे के पीछे होता है जब आप loop में a[i] इस्तेमाल करते हैं।

पर array pointer नहीं है

यहीं कई students फँसते हैं। भले ही array name expressions में pointer की तरह काम करता हो, ये असल में अलग चीज़ें हैं। दो सबूत:

C Language
#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;
}
Output:
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 एक ही हैं?
नहीं, पर ये बहुत करीबी हैं। ज़्यादातर expressions में array name अपने आप अपने पहले element के pointer में बदल ("decay") जाता है, इसीलिए ये एक जैसे व्यवहार करते हैं। पर array memory का एक fixed block है, जबकि pointer एक अलग variable है जिसे दोबारा assign किया जा सकता है — इसलिए ये एक चीज़ नहीं हैं।
a[i] और *(a+i) एक जैसे क्यों काम करते हैं?
क्योंकि C में a[i] की परिभाषा ही *(a + i) है। Array name शुरुआती address देता है, i जोड़ने से i elements आगे बढ़ते हैं, और * वहाँ की value पढ़ता है। दोनों notation एक ही चीज़ में compile होते हैं।
Arrays के संदर्भ में pointer arithmetic क्या है?
Pointer arithmetic यानी pointer में जोड़-घटाव करके memory में आगे-पीछे जाना। C में यह element के size की इकाइयों में चलता है, इसलिए p + 1 अगले element को इशारा करता है, अगले byte को नहीं। यही pointer से array में घूमना संभव बनाता है।
मैं array name को a = p की तरह assign क्यों नहीं कर सकता?
क्योंकि array name कोई बदलने योग्य variable नहीं है — यह memory के एक block का fixed label है। आप एक pointer को दूसरे pointer में copy कर सकते हैं, पर array name को खुद किसी और जगह इशारा नहीं करा सकते। यही array और pointer के बीच सबसे साफ़ अंतर है।
क्या sizeof array और pointer के लिए एक ही result देता है?
नहीं, और यह कई beginners को उलझाता है। sizeof(array) सभी elements का कुल size देता है, जबकि sizeof(pointer) सिर्फ़ pointer का अपना size (आमतौर पर 8 bytes) देता है। यह साबित करता है कि array और pointer अलग तरह से store होते हैं।
← Back to C Tutorial
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

💻 लाइव कोड एडिटर

इस पेज के प्रोग्राम यहीं तैयार हैं — चलाएँ, बदलें और सीखें। कुछ भी इंस्टॉल किए बिना।
OneCompiler द्वारा संचालित। कोड एडिटर में अपने आप आ जाता है — Run दबाकर आउटपुट देखें। अगर एडिटर न खुले तो नए टैब में खोलें.