pointers pointer operations c
बिंदुओं का गहन अध्ययन और सी ++ में उनके उपयोग।
एक पॉइंटर C ++ भाषा की सबसे शक्तिशाली विशेषताओं में से एक है। एक पॉइंटर अपने पते के माध्यम से चर को हेरफेर करने में मदद करता है।
.net c # साक्षात्कार प्रश्न
इस ट्यूटोरियल में, हम C ++ में सभी बिंदुओं और उसके उपयोगों के बारे में विस्तार से जानेंगे।
=> यहाँ सरल सी ++ प्रशिक्षण श्रृंखला देखें।
आप क्या सीखेंगे:
- एक सूचक क्या है?
- सूचक अंकगणित
- नल और शून्य संकेत
- Arrays और संकेत
- पॉइंटर्स की सरणी
- प्वाइंटर ऑफ पॉइंटर्स
- कार्य करने के लिए पासिंग पॉइंट्स
- कार्य बिंदु
- निष्कर्ष
- अनुशंसित पाठ
एक सूचक क्या है?
पॉइंटर एक वैरिएबल है जो मेमोरी लोकेशन का पता रखता है। हम जानते हैं कि हमारे द्वारा घोषित सभी चर स्मृति में एक विशिष्ट पता है। हम इन पतों को स्मृति में इंगित करने के लिए एक सूचक चर घोषित करते हैं।
सूचक चर घोषित करने के लिए सामान्य वाक्यविन्यास है:
datatype * variable_name;
उदाहरण के लिए, घोषणा int * ptr;
इसका मतलब है कि ptr एक ऐसा पॉइंटर है जो टाइप इंट के वैरिएबल की ओर इशारा करता है। इसलिए एक पॉइंटर वैरिएबल में हमेशा मेमोरी लोकेशन या एड्रेस होता है। आइए हम नीचे सूचक चर का कार्य देखते हैं।
विचार करें कि हमारे पास निम्नलिखित घोषणाएँ हैं:
Int p, *ptr; //declare variable p and pointer variable ptr p = 4; //assign value 4 to variable p ptr = &p; //assign address of p to pointer variable ptr
स्मृति में, इन घोषणाओं को निम्नानुसार दर्शाया जाएगा:
यह मेमोरी में पॉइंटर का आंतरिक प्रतिनिधित्व है। जब हम पॉइंटर वैरिएबल को एड्रेस वेरिएबल असाइन करते हैं, तो यह वेरिएबल को इंगित करता है, जैसा कि ऊपर दिए गए प्रतिनिधित्व में दिखाया गया है।
जैसा कि ptr में चर p का पता होता है, * ptr चर p का मान देगा (चर सूचक चर को इंगित करता है)।
ध्यान दें: ऑपरेटर * जिसे हम पॉइंटर के साथ उपयोग करते हैं, इसका उपयोग यह दर्शाने के लिए किया जाता है कि यह पॉइंटर वैरिएबल है।
आइए हम कुछ सूचक अवधारणाओं को देखते हैं जो C ++ में उपयोग किए जाते हैं।
सूचक अंकगणित
हम जानते हैं कि एक पॉइंटर वैरिएबल हमेशा मेमोरी में एड्रेस को इंगित करता है। हमारे द्वारा किए जा सकने वाले ऑपरेशनों में, हमारे पास निम्नलिखित अंकगणितीय ऑपरेशन हैं जो पॉइंटर्स पर किए जाते हैं।
- वृद्धि ऑपरेटर (++)
- कमी ऑपरेटर (-)
- जोड़ (+)
- घटाव (-)
हमें एक उदाहरण कार्यक्रम में इन कार्यों के उपयोग को देखते हैं।
#include #include using namespace std; int main() { int myarray(5) = {2, 4,6, 8,10}; int* myptr; myptr = myarray; cout<<'First element in the array :'<<*myptr< आउटपुट:
सरणी में पहला तत्व: 2
सरणी में अगला तत्व: 4
सरणी में अगला तत्व: 6
सरणी में अगला तत्व: 4
सरणी में अगला तत्व: 2
हमने पॉइंटर्स पर किए गए अंकगणितीय ऑपरेशनों को देखा है। ध्यान दें कि वेतन वृद्धि ऑपरेटर ++ सूचक को बढ़ाता है और सरणी में अगले तत्व को इंगित करता है। इसी तरह, डेक्रिमेंट ऑपरेटर सूचक चर को 1 से घटाता है ताकि यह सरणी में पिछले तत्व को इंगित करे।
हम + और - ऑपरेटरों का भी उपयोग करते हैं। सबसे पहले, हमने पॉइंटर चर में 1 जोड़ा है। परिणाम दिखाता है कि यह सरणी में अगले तत्व को इंगित करता है। इसी तरह, - ऑपरेटर एरे में पिछले तत्व को इंगित करने के लिए पॉइंटर चर बनाता है।
इन अंकगणित ऑपरेटरों के अलावा, हम ==, जैसे तुलना ऑपरेटरों का भी उपयोग कर सकते हैं।
नल और शून्य संकेत
यदि मामले में, एक पॉइंटर वेरिएबल को वैरिएबल का पता नहीं सौंपा गया है, तो पॉइंटर वैरिएबल को NULL वैल्यू असाइन करना एक अच्छा अभ्यास है। NULL मान वाले सूचक चर को NULL पॉइंटर कहा जाता है।
एक अशक्त सूचक iostream हैडर में परिभाषित मूल्य शून्य के साथ एक निरंतर सूचक है। पता 0 पर स्मृति ऑपरेटिंग सिस्टम द्वारा आरक्षित है और हम इस स्थान तक नहीं पहुँच सकते।
नल पॉइंटर का उपयोग करके, हम अप्रयुक्त पॉइंटर्स के दुरुपयोग से बच सकते हैं और पॉइंटर वैरिएबल को कुछ कचरा मान रखने से रोक सकते हैं।
शून्य बिंदु वे विशेष बिंदु हैं जो बिना किसी प्रकार के मानों को इंगित करते हैं। शून्य बिंदु अधिक लचीले होते हैं क्योंकि वे किसी भी प्रकार की ओर इशारा कर सकते हैं। लेकिन वे सीधे नहीं हो सकते। डेरेफ़रिंग के लिए, शून्य पॉइंटर को एक पॉइंटर में बदलने की आवश्यकता होती है जो कंक्रीट डेटा प्रकार के साथ एक मान को इंगित करता है।
हमने निम्नलिखित कोड उदाहरण में NULL पॉइंटर और शून्य पॉइंटर के काम को दिखाया है।
#include #include using namespace std; int main() { int intvar = 10; char c = 'A'; void* vptr; int* myptr = NULL; cout<<'NULL pointer value :'< आउटपुट:
पूर्ण सूचक मान: 0
शून्य सूचक vtr अंक: A
शून्य सूचक vtr अंक: 10
उपरोक्त कार्यक्रम में, पहले, हम एक पूर्णांक सूचक की घोषणा करते हैं जिसे एक मान NULL सौंपा जाता है। जब हम इस पॉइंटर को प्रिंट करते हैं, तो हम देखते हैं कि मान 0 है जैसा कि हमने पहले चर्चा की है।
अगला, हम एक शून्य सूचक की घोषणा करते हैं। सबसे पहले, हम इस शून्य सूचक को वर्ण चर का पता देते हैं। फिर हम एक चरित्र सूचक को शून्य पॉइंटर देते हैं और इसे चार * के साथ टाइपकास्ट करते हैं। इसके बाद, हम चारपार्ट वैल्यू प्रिंट करते हैं जो चार A को इंगित करता है जो एक कैरेक्टर वैरिएबल था जिसे हमने पहले घोषित किया था और शून्य पॉइंटर द्वारा इंगित किया गया है।
अगला, हमने एक पूर्णांक चर को शून्य सूचक को सौंपा है और फिर हम पूर्णांक सूचक का उपयोग करके इस शून्य सूचक को dereferencing के समान चरणों को पूरा करते हैं।
Arrays और संकेत
Arrays और संकेत एक दूसरे के साथ दृढ़ता से जुड़े हुए हैं। हम जानते हैं कि सरणी का नाम सरणी में पहले तत्व को इंगित करता है और यह एक निरंतर सूचक है।
हम इस पॉइंटर को पॉइंटर वेरिएबल में असाइन कर सकते हैं और फिर पॉइंटर को डीक्रिमेट करके या सबस्क्रिप्ट ऑपरेटर का उपयोग करके एरे तक पहुंच सकते हैं।
हम इस कोड को सूचक चर और सरणी के बीच निम्न कोड उदाहरण में देखेंगे।
#include #include using namespace std; int main() { int myarray(5) = {1, 1, 2, 3, 5}; int* ptrvar; ptrvar = myarray; for(int i=0;i<5;i++) { cout<<*ptrvar<<' '; ptrvar++; } return 0; }
आउटपुट:
1 1 2 3 5
उपरोक्त कार्यक्रम में, हम एक पॉइंटर चर के लिए सरणी नाम असाइन करते हैं। जैसा कि सरणी नाम सरणी में पहले तत्व को इंगित करता है, हम एक सूचक चर का उपयोग करके संपूर्ण सरणी की सामग्री को प्रिंट कर सकते हैं और ++ ऑपरेटर का उपयोग करके इसे बढ़ा सकते हैं। यह आउटपुट में दिखाया गया है।
पॉइंटर्स की सरणी
कभी-कभी, हमें एक प्रोग्राम में एक से अधिक पॉइंटर चर की आवश्यकता होती है। प्रत्येक व्यक्तिगत पॉइंटर चर को घोषित करने के बजाय, हम पॉइंटर्स की एक सरणी घोषित कर सकते हैं।
आइए हम बिंदुओं की एक सरणी प्रदर्शित करने के लिए एक उदाहरण लेते हैं।
कैसे खोलें .json फ़ाइल
#include #include using namespace std; int main() { int myarray(5) = {2,4,6,8,10}; int *ptr(5); //array of pointers for(int i=0;i<5;i++){ ptr(i) = &myarray(i); } for (int i = 0; i < 5; i++) { cout << 'Value of myarray(' << i << ') = '; cout << *ptr(i) << endl; } return 0; }
आउटपुट:
मायार्रे का मूल्य (0) = 2
मायार्रे का मूल्य (1) = ४
मायार्रे का मूल्य (२) = ६
मायार्रे का मूल्य (3) = 8
मायार्रे का मूल्य (4) = १०
उपरोक्त घोषणा में,
int * ptr (5);
हम इसकी व्याख्या कर सकते हैं; ptr 5 पूर्णांक बिंदुओं की एक सरणी है। इसलिए ptr का प्रत्येक तत्व प्रकार पूर्णांक के एक चर को इंगित करेगा।
हम एक पूर्णांक सरणी का उपयोग करते हैं और सरणी के प्रत्येक तत्व का पता प्रत्येक ptr तत्वों को देते हैं। फिर हम '* ptr (i)' आउटपुट करके ptr ऐरे की सामग्री प्रदर्शित करते हैं।
प्वाइंटर ऑफ पॉइंटर्स
सूचक का सूचक और कुछ नहीं बल्कि कई अप्रत्यक्ष संकेत हैं। यह पॉइंटर्स की एक तरह की श्रृंखला है। जब हम पॉइंटर्स के एक पॉइंटर को परिभाषित करते हैं, तो पहले पॉइंटर में दूसरे पॉइंटर का एक पता होता है, जिसके बदले में उस वेरिएबल का पता होता है, जो इसे इंगित करता है।
स्मृति में, इसे निम्न रूप में दर्शाया जाएगा:
पॉइंटर्स के एक पॉइंटर को निम्नानुसार घोषित किया जाता है:
int** intptr;
हम सीधे पॉइंटर्स के पॉइंटर को बेहतर ढंग से समझने के लिए एक कोड उदाहरण लेते हैं।
#include #include using namespace std; int main() { int *vptr; int ** intptr; int var = 10; vptr = &var; intptr = &vptr; cout<<'Variable var: '< आउटपुट:
चर संस्करण: १०
सूचक को चर: १०
एक चर को इंगित करने के लिए सूचक: 10
उपरोक्त कार्यक्रम में, हम पूर्णांक चर, पूर्णांक सूचक और पूर्णांक के लिए सूचक का सूचक घोषित करते हैं। जैसा कि कार्यक्रम में दिखाया गया है, पॉइंटर वैरिएबल को एक वैरिएबल का मान असाइन किया गया है। पॉइंटर वेरिएबल के पॉइंटर को पॉइंटर वैरिएबल का पता सौंपा जाता है।
अंत में, हम तीन वेरिएबल्स को प्रिंट करते हैं जो समान मान 10 को पूर्णांक चर के बराबर प्रदर्शित करते हैं।
कार्य करने के लिए पासिंग पॉइंट्स
फ़ंक्शन करने के लिए पासिंग पॉइंट अन्य पैरामीटर पासिंग तकनीकों के समान है जिसमें हम फ़ंक्शन को पॉइंटर चर पास करते हैं।
हम अपने स्वैपिंग दो मूल्यों पर दोबारा गौर करते हैं और इसे संशोधित करते हुए पॉइंटर चर को मापदंडों के रूप में पास करते हैं।
#include #include using namespace std; void swap(int* a, int* b) { int temp; temp = *a; *a = *b; *b = temp; } int main() { int a, b; cout<>a>>b; cout<<'a = '< आउटपुट:
स्वैप किए जाने वाले मान दर्ज करें: 3 2
a = 3 बी = 2
मूल्यों की अदला-बदली
a = 2 बी = 3
जैसा कि कार्यक्रम में दिखाया गया है, हम पूर्णांक चर के रूप में स्वैप किए जाने वाले मानों को पास करते हैं। औपचारिक मापदंडों को सूचक चर के रूप में परिभाषित किया गया है। इसके परिणामस्वरूप, फ़ंक्शन के अंदर वेरिएबल्स में किए गए परिवर्तन कॉलिंग फ़ंक्शन में भी बाहर परिलक्षित होते हैं।
कार्य बिंदु
उसी तरह, जैसे हमारे पास वेरिएबल्स, एरेज़ आदि के लिए पॉइंटर्स हैं, हम पॉइंटर्स टू फंक्शन भी कर सकते हैं। लेकिन अंतर यह है कि फ़ंक्शन पॉइंटर निष्पादन योग्य कोड को इंगित करता है और चर या सरणियों जैसे डेटा को नहीं।
हम फ़ंक्शन पॉइंटर्स प्रदर्शित करने के लिए एक उदाहरण लेते हैं।
#include #include using namespace std; void displayVal(int a) { printf('Value of a is %d
', a); } int main() { void (*func_ptr)(int) = &displayVal; (*func_ptr)(100); return 0; }
आउटपुट:
A का मान 100 है
कैसे एक सरणी जावा कॉपी करने के लिए
उपरोक्त कार्यक्रम में, हमारे पास एक फ़ंक्शन 'डिस्प्लेवैल' है जो सिर्फ एक पूर्णांक मान को प्रिंट करता है जो इसे पारित किया गया है। मुख्य फ़ंक्शन में, हमने एक फ़ंक्शन पॉइंटर _ func_ptr ’को परिभाषित किया है जो एक तर्क के रूप में एक इंट लेता है और एक शून्य प्रकार देता है।
शून्य (* func_ptr) (int)
ध्यान दें: हमें फ़ंक्शन पॉइंटर को अंदर संलग्न करना होगा ()। यदि हम इसे छोड़ देते हैं, तो यह एक फ़ंक्शन प्रोटोटाइप बन जाएगा।
हमने इस फ़ंक्शन पॉइंटर को फ़ंक्शन 'डिस्प्लेवैल' का पता दिया है। फिर इस फ़ंक्शन पॉइंटर c func_ptr ’का उपयोग करते हुए हम तर्क 100 मान देते हैं जो कि प्रदर्शन 100 कॉलिंग के बराबर है।
अब यदि हमारे पास एक ही प्रोटोटाइप के साथ एक और फ़ंक्शन है, तो हम फ़ंक्शन के पते को असाइन करके उसी फ़ंक्शन पॉइंटर का उपयोग कर सकते हैं। यह फ़ंक्शन पॉइंटर्स का प्रमुख उपयोग है।
निष्कर्ष
यह सभी बिंदुओं, इसकी परिभाषा और C ++ में उपयोग के बारे में है।
हमारे अगले ट्यूटोरियल में, हम C ++ में संदर्भों के बारे में अधिक जानेंगे। C ++ में सन्दर्भों का भी विशेष उपयोग होता है और अक्सर इन्हें चरों के लिए उपनाम के रूप में उपयोग किया जाता है।
=> निरपेक्ष सी ++ प्रशिक्षण श्रृंखला के लिए यहां क्लिक करें।
अनुशंसित पाठ