पॉइंटर एक वेरिएबल है जो दूसरे वेरिएबल का पता संग्रहीत करता है।
पॉइंटर्स की विशेषताएँ
- मेमोरी स्पेस बचाता है।
- मेमोरी लोकेशन तक सीधी पहुंच के कारण एक्जीक्यूशन समय तेज होता है।
- पॉइंटर्स की मदद से मेमोरी कुशलतापूर्वक एक्सेस होती है (डायनामिक आवंटन/डीआवंटन)।
- डेटा स्ट्रक्चर्स के साथ उपयोग किया जाता है।
पॉइंटर्स और टू-डायमेंशनल एरे
टू-डायमेंशनल एरे के लिए मेमोरी आवंटन:
int a[3][3] = {1,2,3,4,5,6,7,8,9};
मेमोरी में लेआउट (रो-मेजर ऑर्डर):
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] a[2][0] a[2][1] a[2][2] 1 2 3 4 5 6 7 8 9
पॉइंटर अंकगणित के साथ एक्सेस:
a[1][2] = *(&a[0][0] + 1*3 + 2) = *(&a[0][0] + 5) = 6
उदाहरण प्रोग्राम
#include <stdio.h>
int main() {
int a[3][3], i, j;
int *p;
printf("Enter elements of 2D array:\n");
for(i=0; i<3; i++) {
for(j=0; j<3; j++) {
scanf("%d", &a[i][j]);
}
}
p = &a[0][0]; // पहले एलिमेंट का पता
printf("Elements of 2D array are:\n");
for(i=0; i<3; i++) {
for(j=0; j<3; j++) {
printf("%d\t", *(p + i*3 + j)); // पॉइंटर अंकगणित
}
printf("\n");
}
return 0;
}
आउटपुट
Enter elements of 2D array: 1 2 3 4 5 6 7 8 9 Elements of 2D array are: 1 2 3 4 5 6 7 8 9
व्याख्या
p = &a[0][0]- पॉइंटरpपहले एलिमेंट का पता रखता है।*(p + i*3 + j)- रोi, कॉलमjका एलिमेंट एक्सेस करता है।- फॉर्मूला:
base_address + (row * COLS + col) * sizeof(int)
पॉइंटर सरणी के साथ 2D एरे
पॉइंटर्स की सरणी का उपयोग करके:
int *ptr[3];
for(i=0; i<3; i++)
ptr[i] = a[i]; // प्रत्येक रो का बेस पता
// एक्सेस: ptr[i][j] या *(ptr[i] + j)
मुख्य बिंदु
- 2D एरे मेमोरी में सन्निहित (contiguous) होता है।
- पॉइंटर अंकगणित से किसी भी एलिमेंट तक O(1) एक्सेस।
a[i][j]आंतरिक रूप से*(*(a+i)+j)में बदल जाता है।