पॉइंटर घोषणा, प्रारंभिकरण और एक्सेस
1. सामान्य चर
int qty = 179;
// मेमोरी में: पता 1000 पर मान 179 संग्रहीत
2. पॉइंटर घोषणा
int *p; // p एक पॉइंटर चर है जो int का पता रख सकता है
3. पॉइंटर प्रारंभिकरण
int qty = 175;
int *p;
p = &qty; // एड्रेस-ऑफ ऑपरेटर (&) से पता प्राप्त करें
मेमोरी आरेख
qty (int) : पता 0x7fff...a0, मान 175
p (int*) : पता 0x7fff...a8, मान 0x7fff...a0 (qty का पता)
*p (डीरेफरेंस): मान 175 (qty के समान)
सरणी/स्ट्रिंग में पॉइंटर एक्सेस उदाहरण
#include <stdio.h>
int main() {
char s[] = {'a', 'b', 'c', '\n', 'c', '\0'};
char *p, *str, *str1;
p = &s[3]; // '\n' (नई लाइन, ASCII 10) का पता
str = p; // str भी '\n' की ओर
str1 = s; // str1 'a' (ASCII 97) की ओर
// ++*p: *p (10) को 11 करता है, मान 11 देता है
// ++*str1: *str1 (97) को 98 करता है, मान 98 देता है
// 11 + 98 - 32 = 77
printf("%d\n", ++*p + ++*str1 - 32);
return 0;
}
आउटपुट
77
चरण-दर-चरण गणना
s = ['a'(97), 'b'(98), 'c'(99), '\n'(10), 'c'(99), '\0'(0)]
0 1 2 3 4 5
p = &s[3] → '\n' (10) का पता
str = p → '\n' (10) का पता
str1 = s → 'a' (97) का पता
++*p : *p था 10, अब 11, मान 11
++*str1: *str1 था 97, अब 98, मान 98
11 + 98 - 32 = 77
पॉइंटर एक्सेस के तरीके
| सिंटैक्स | नाम | उदाहरण |
*ptr | डीरेफरेंस (इनडायरेक्शन) | मान प्राप्त करें/सेट करें |
ptr[i] | सरणी सबस्क्रिप्ट | *(ptr + i) के बराबर |
ptr->member | स्ट्रक्चर/यूनियन सदस्य | (*ptr).member के बराबर |
ptr + n | पॉइंटर अंकगणित | n तत्व आगे |
सामान्य पैटर्न
// 1. सरणी पार करना
for (int *p = arr; p < arr + n; p++) {
printf("%d ", *p);
}
// 2. स्ट्रिंग पार करना
for (char *p = str; *p; p++) {
putchar(*p);
}
// 3. स्ट्रक्चर पॉइंटर
struct Node *curr = head;
while (curr) {
printf("%d ", curr->data);
curr = curr->next;
}
// 4. फंक्शन में आउटपुट पैरामीटर
void divide(int a, int b, int *quot, int *rem) {
*quot = a / b;
*rem = a % b;
}
सावधानियाँ
- हमेशा उपयोग से पहले प्रारंभिकृत करें
- NULL जांच करें डीरेफरेंस से पहले
- मुक्त की गई मेमोरी एक्सेस न करें
- सरणी सीमा के भीतर रहें
const सहीता: const int *p (मान स्थिर), int *const p (पॉइंटर स्थिर)