अध्याय 11: पॉइंटर्स (Pointers)

अध्याय 11: पॉइंटर्स (Pointers)

पॉइंटर्स C प्रोग्रामिंग में एक शक्तिशाली और महत्वपूर्ण फीचर हैं। पॉइंटर्स एक विशेष प्रकार का वेरिएबल होते हैं जो किसी अन्य वेरिएबल के मेमोरी एड्रेस को संग्रहीत करते हैं। पॉइंटर्स के माध्यम से हम डायरेक्ट मेमोरी एक्सेस, डायनामिक मेमोरी अलोकेशन, और फंक्शन्स को अधिक कुशलता से हैंडल कर सकते हैं। पॉइंटर्स का सही उपयोग प्रोग्राम की दक्षता और लचीलापन बढ़ाता है, लेकिन इसके साथ ही यह प्रोग्रामिंग त्रुटियों की संभावना को भी बढ़ा सकता है, इसलिए इन्हें संभालते समय सावधानी बरतनी चाहिए।

पॉइंटर्स का परिचय (Introduction to Pointers)

पॉइंटर्स एक ऐसा वेरिएबल है जो किसी अन्य वेरिएबल के मेमोरी एड्रेस को संग्रहीत करता है। इसे डिक्लेयर करते समय * ऑपरेटर का उपयोग किया जाता है। पॉइंटर्स का उपयोग विभिन्न प्रकार के ऑपरेशन्स, जैसे कि मेमोरी लोकेशन को एक्सेस करना, वेरिएबल्स के बीच डेटा साझा करना, और फंक्शन्स के साथ काम करना, के लिए किया जाता है।

उदाहरण:

#include <stdio.h>

int main() {
    int var = 10;
    int *ptr;

    ptr = &var; // ptr में var का मेमोरी एड्रेस संग्रहीत किया गया है

    printf("Value of var: %d\n", var);
    printf("Address of var: %p\n", &var);
    printf("Value of ptr: %p\n", ptr);
    printf("Value pointed by ptr: %d\n", *ptr);

    return 0;
}

पॉइंटर्स और एरेज (Pointers and Arrays)

पॉइंटर्स और एरेज का गहरा संबंध होता है। एरे का नाम स्वयं एक पॉइंटर होता है जो पहले तत्व के मेमोरी एड्रेस को दर्शाता है। पॉइंटर्स का उपयोग करके हम एरे तत्वों को एक्सेस और संशोधित कर सकते हैं।

 

फंक्शन्स में पॉइंटर्स का उपयोग (Using Pointers in Functions)

फंक्शन्स में पॉइंटर्स का उपयोग करके, हम फंक्शन को डेटा का मेमोरी एड्रेस पास कर सकते हैं, जिससे हमें मूल डेटा को संशोधित करने की अनुमति मिलती है। यह तकनीक विशेष रूप से तब उपयोगी होती है जब हमें बड़े डेटा स्ट्रक्चर को फंक्शन में पास करना हो, क्योंकि यह मेमोरी और समय की बचत करता है।

 

इस अध्याय में, हम पॉइंटर्स के उपयोग, उनके साथ विभिन्न ऑपरेशन्स, और फंक्शन्स में उनके उपयोग को विस्तार से समझेंगे। उदाहरणों के माध्यम से, हम पॉइंटर्स के साथ काम करने के विभिन्न तरीकों को जानेंगे और उनके उपयोग की कुशलता को समझेंगे।

 

पॉइंटर्स और एरेज (Pointers and Arrays)

पॉइंटर्स और एरेज का गहरा संबंध होता है। एरे का नाम स्वयं एक पॉइंटर होता है जो एरे के पहले तत्व का मेमोरी एड्रेस रखता है। इस खंड में, हम पॉइंटर्स और एरेज के बीच संबंध को समझेंगे और सीखेंगे कि कैसे पॉइंटर्स का उपयोग करके एरे तत्वों को एक्सेस और संशोधित किया जा सकता है।

एरे का नाम एक पॉइंटर के रूप में (Array Name as a Pointer)

C में, एरे का नाम खुद एक पॉइंटर होता है जो एरे के पहले तत्व का एड्रेस रखता है। यह पॉइंटर उस डेटा प्रकार का होता है जिसे एरे स्टोर करता है।

उदाहरण:

#include <stdio.h>

int main() {
    int numbers[5] = {10, 20, 30, 40, 50};

    printf("Address of first element: %p\n", numbers);
    printf("Address of first element using &: %p\n", &numbers[0]);

    return 0;
}

एरे तत्वों को पॉइंटर के माध्यम से एक्सेस करना (Accessing Array Elements using Pointers)

पॉइंटर का उपयोग करके हम एरे के तत्वों को आसानी से एक्सेस कर सकते हैं। पॉइंटर अंकगणित (pointer arithmetic) का उपयोग करके हम एरे के विभिन्न तत्वों तक पहुंच सकते हैं।

उदाहरण:

#include <stdio.h>

int main() {
    int numbers[5] = {10, 20, 30, 40, 50};
    int *ptr = numbers;

    // एरे तत्वों को पॉइंटर का उपयोग करके एक्सेस करना
    for (int i = 0; i < 5; i++) {
        printf("Element at index %d: %d\n", i, *(ptr + i));
    }

    return 0;
}

एरे तत्वों को पॉइंटर के माध्यम से संशोधित करना (Modifying Array Elements using Pointers)

हम पॉइंटर का उपयोग करके एरे के तत्वों को संशोधित भी कर सकते हैं। पॉइंटर के माध्यम से किसी तत्व को एक्सेस करके हम उसका मान बदल सकते हैं।

उदाहरण:

#include <stdio.h>

int main() {
    int numbers[5] = {10, 20, 30, 40, 50};
    int *ptr = numbers;

    // एरे तत्वों को पॉइंटर का उपयोग करके संशोधित करना
    *(ptr + 2) = 35;

    // संशोधित एरे को प्रिंट करना
    for (int i = 0; i < 5; i++) {
        printf("Element at index %d: %d\n", i, numbers[i]);
    }

    return 0;
}

मल्टी-डायमेंशनल एरे और पॉइंटर्स (Multi-Dimensional Arrays and Pointers)

मल्टी-डायमेंशनल एरे के साथ पॉइंटर्स का उपयोग करना भी संभव है। पॉइंटर्स का उपयोग करके हम मल्टी-डायमेंशनल एरे के तत्वों को एक्सेस और संशोधित कर सकते हैं।

उदाहरण:

#include <stdio.h>

int main() {
    int matrix[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };
    int (*ptr)[3] = matrix;

    // मल्टी-डायमेंशनल एरे के तत्वों को पॉइंटर का उपयोग करके एक्सेस करना
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("Element at row %d, column %d: %d\n", i, j, *(*(ptr + i) + j));
        }
    }

    return 0;
}

फंक्शन्स में पॉइंटर्स का उपयोग (Using Pointers in Functions)

 

C प्रोग्रामिंग में, फंक्शन्स में पॉइंटर्स का उपयोग करना एक सामान्य प्रैक्टिस है। पॉइंटर्स के माध्यम से हम फंक्शन को डेटा का मेमोरी एड्रेस पास कर सकते हैं, जिससे हम मूल डेटा को सीधे संशोधित कर सकते हैं। यह विशेष रूप से तब उपयोगी होता है जब हमें बड़े डेटा स्ट्रक्चर को फंक्शन में पास करना हो, क्योंकि यह मेमोरी और समय की बचत करता है।

 

फंक्शन्स में पॉइंटर्स को पास करना (Passing Pointers to Functions)

पॉइंटर्स को फंक्शन में पास करने के लिए, हमें फंक्शन पैरामीटर को पॉइंटर प्रकार के रूप में परिभाषित करना होता है। इसके बाद, हम फंक्शन कॉल करते समय वेरिएबल का एड्रेस पास कर सकते हैं।

उदाहरण:

#include <stdio.h>

// फंक्शन प्रोटोटाइप
void increment(int *num);

int main() {
    int value = 10;

    // फंक्शन कॉल में वेरिएबल का एड्रेस पास करना
    increment(&value);

    printf("Value after increment: %d\n", value);

    return 0;
}

// फंक्शन डिफिनेशन
void increment(int *num) {
    (*num)++; // वेरिएबल का मान बढ़ाना
}

इस उदाहरण में, increment फंक्शन एक पॉइंटर को स्वीकार करता है और वेरिएबल के मान को बढ़ाता है। मुख्य फंक्शन में, हम वेरिएबल का एड्रेस पास करते हैं, जिससे increment फंक्शन वेरिएबल के मान को सीधे संशोधित कर सकता है।

एरेज को फंक्शन्स में पास करना (Passing Arrays to Functions)

एरेज को फंक्शन में पास करना वास्तव में एक पॉइंटर को पास करने के समान है, क्योंकि एरे का नाम खुद एक पॉइंटर होता है। फंक्शन में एरे पास करते समय, हमें एरे के आकार को भी पास करना चाहिए ताकि फंक्शन एरे के सभी तत्वों पर ऑपरेशन्स कर सके।

उदाहरण:

#include <stdio.h>

// फंक्शन प्रोटोटाइप
void printArray(int *arr, int size);

int main() {
    int numbers[5] = {10, 20, 30, 40, 50};

    // एरे को फंक्शन में पास करना
    printArray(numbers, 5);

    return 0;
}

// फंक्शन डिफिनेशन
void printArray(int *arr, int size) {
    for (int i = 0; i < size; i++) {
        printf("Element at index %d: %d\n", i, arr[i]);
    }
}

इस उदाहरण में, printArray फंक्शन एक पॉइंटर और एरे के आकार को स्वीकार करता है। मुख्य फंक्शन में, हम एरे का नाम और उसका आकार पास करते हैं, जिससे printArray फंक्शन एरे के सभी तत्वों को प्रिंट कर सकता है।

स्ट्रिंग्स को फंक्शन्स में पास करना (Passing Strings to Functions)

स्ट्रिंग्स वास्तव में कैरेक्टर का एरे होती हैं, इसलिए इन्हें फंक्शन में पास करना भी पॉइंटर पास करने के समान है। फंक्शन में स्ट्रिंग पास करते समय, हमें केवल स्ट्रिंग का नाम पास करना होता है।

उदाहरण:

#include <stdio.h>

// फंक्शन प्रोटोटाइप
void printString(char *str);

int main() {
    char message[] = "Hello, World!";

    // स्ट्रिंग को फंक्शन में पास करना
    printString(message);

    return 0;
}

// फंक्शन डिफिनेशन
void printString(char *str) {
    printf("String: %s\n", str);
}

इस उदाहरण में, printString फंक्शन एक स्ट्रिंग को स्वीकार करता है। मुख्य फंक्शन में, हम स्ट्रिंग का नाम पास करते हैं, जिससे printString फंक्शन स्ट्रिंग को प्रिंट कर सकता है।

मल्टी-डायमेंशनल एरेज को फंक्शन्स में पास करना (Passing Multi-Dimensional Arrays to Functions)

मल्टी-डायमेंशनल एरे को फंक्शन्स में पास करना थोड़ा जटिल हो सकता है, लेकिन यह संभव है। हमें एरे के सभी आयामों का आकार फंक्शन प्रोटोटाइप में निर्दिष्ट करना होता है।

उदाहरण:

#include <stdio.h>

// फंक्शन प्रोटोटाइप
void printMatrix(int matrix[2][3]);

int main() {
    int matrix[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };

    // मल्टी-डायमेंशनल एरे को फंक्शन में पास करना
    printMatrix(matrix);

    return 0;
}

// फंक्शन डिफिनेशन
void printMatrix(int matrix[2][3]) {
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("Element at row %d, column %d: %d\n", i, j, matrix[i][j]);
        }
    }
}

इस उदाहरण में, printMatrix फंक्शन एक 2×3 मैट्रिक्स को स्वीकार करता है। मुख्य फंक्शन में, हम मैट्रिक्स का नाम पास करते हैं, जिससे printMatrix फंक्शन मैट्रिक्स के सभी तत्वों को प्रिंट कर सकता है।



Index