पॉइंटर्स के कई लेकिन आसान कॉन्सेप्ट्स हैं और वे C प्रोग्रामिंग के लिए बहुत महत्वपूर्ण हैं।
दो अंकगणितीय पॉइंटर कॉन्सेप्ट्स नीचे समझाए गए हैं: C पॉइंटर एडिशन और सब्ट्रैक्शन।
C पॉइंटर एडिशन
C पॉइंटर एडिशन का अर्थ है पॉइंटर वेरिएबल में एक मान जोड़ना।
फॉर्मूला
new_address = current_address + (number * size_of(data_type))
उदाहरण
#include <stdio.h>
int main() {
int num = 500;
int *ptr; // int का पॉइंटर
ptr = # // number वेरिएबल का पता स्टोर करता है
printf("Address of ptr is %p\n", (void*)ptr);
ptr = ptr + 7; // पॉइंटर वेरिएबल में 7 जोड़ना
printf("After adding, address of ptr is %p\n", (void*)ptr);
return 0;
}
आउटपुट (उदाहरण)
Address of ptr is 0x7ffee4b8c9ac After adding, address of ptr is 0x7ffee4b8c9c8
व्याख्या: ptr + 7 का अर्थ है 7 int एलिमेंट्स आगे बढ़ना। चूंकि sizeof(int) = 4 बाइट्स (आमतौर पर), पता 7 * 4 = 28 बाइट्स बढ़ जाता है।
C पॉइंटर सब्ट्रैक्शन
यह पॉइंटर वेरिएबल से एक मान घटाता है। पॉइंटर वेरिएबल से किसी भी संख्या को घटाने पर एक पता मिलता है।
फॉर्मूला
new_address = current_address - (number * size_of(data_type))
उदाहरण
#include <stdio.h>
int main() {
int num = 500;
int *ptr; // int का पॉइंटर
ptr = # // number वेरिएबल का पता स्टोर करता है
printf("Address of ptr is %p\n", (void*)ptr);
ptr = ptr - 5; // पॉइंटर वेरिएबल से 5 घटाना
printf("After subtraction, address of ptr is %p\n", (void*)ptr);
return 0;
}
आउटपुट (उदाहरण)
Address of ptr is 0x7ffee4b8c9ac After subtraction, address of ptr is 0x7ffee4b8c994
व्याख्या: ptr - 5 का अर्थ है 5 int एलिमेंट्स पीछे जाना। पता 5 * 4 = 20 बाइट्स घट जाता है।
पॉइंटर डिफरेंस (दो पॉइंटर्स घटाना)
एक ही सरणी के दो पॉइंटर्स को घटाने पर उनके बीच के एलिमेंट्स की संख्या मिलती है:
#include <stdio.h>
int main() {
int arr[] = {10, 20, 30, 40, 50};
int *p1 = &arr[1]; // &arr[1]
int *p2 = &arr[4]; // &arr[4]
printf("p2 - p1 = %td elements\n", p2 - p1); // 3 एलिमेंट्स
printf("Byte difference: %td bytes\n", (char*)p2 - (char*)p1); // 12 बाइट्स
return 0;
}
मुख्य नियम
- पॉइंटर अंकगणित स्केल्ड होता है:
ptr + nका अर्थ हैn * sizeof(*ptr)बाइट्स आगे। - केवल एक ही सरणी/ऑब्जेक्ट के पॉइंटर्स पर वैध।
- सरणी बाउंड्स के बाहर पॉइंटर ले जाना अनिर्दिष्ट व्यवहार है (भले ही डीरेफरेंस न करें)।
%pफॉर्मेट स्पेसिफायर और(void*)कास्ट का उपयोग पतों को प्रिंट करने के लिए करें।