मुख्य कंटेंट तक स्किप करें

पॉइंटर

परिचय

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


पॉइंटर घोषणा

Wave में, पॉइंटर्स को ptr<type> प्रारूप में घोषित किया जाता है। उदाहरण के लिए, एक पूर्णांक प्रकार का पॉइंटर इस प्रकार घोषित किया जा सकता है:

var p: ptr<i32>;

यह घोषणा i32 प्रकार के मूल्य को इंगित करने वाले पॉइंटर p को बनाता है।


पॉइंटर प्रारंभInitialization मन्त्रालय ्.

पॉइंटर्स को वेरिएबल के एड्रेस का उपयोग करते हुए & ऑपरेटर के साथ प्रारंभ किया जा सकता है:

var a: i32 = 10;
var p: ptr<i32> = &a;

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


पॉइंटर डिरेफरेंसिंग

पॉइंटर द्वारा इंगित किए गए मूल्य को पढ़ने या संशोधित करने के लिए deref कीवर्ड का उपयोग किया जाता है। इसे डिरेफरेंसिंग कहा जाता है:

var a: i32 = 10;
var p: ptr<i32> = &a;

println("{}", deref p); // 10 आउटपुट

deref p = 20;
println("{}", a); // 20 आउटपुट

NULL पॉइंटर

Wave में, null पॉइंटर्स को null कीवर्ड के माध्यम से व्यक्त किया जाता है। पॉइंटर वेरिएबल्स को null के रूप में प्रारंभ किया जा सकता है, और इस स्थिति में यह किसी भी वैध मेमोरी को इंगित नहीं करते:

var p: ptr<i32> = null;

अगर null पॉइंटर को डिरेफरेंस किया जाता है, तो कंपाइलर त्रुटि उत्पन्न करेगा।


मल्टीपल पॉइंटर्स

Wave मल्टीपल पॉइंटर्स का समर्थन करता है। पॉइंटर्स को कई स्तरों पर नेस्ट करके घोषित और उपयोग कर सकते हैं:

var x: i32 = 1;
var p1: ptr<i32> = &x;
var p2: ptr<ptr<i32>> = &p1;
var p3: ptr<ptr<ptr<i32>>> = &p2;

println("{}", deref p1); // 1
println("{}", deref deref p2); // 1
println("{}", deref deref deref p3); // 1

ऐरे और पॉइंटर्स

पॉइंटर आँकड़ा तत्व या आकड़े के सम्पूर्ण समूह को भी इंगित कर सकते हैं।

आकड़ा तत्व को इंगित करने वाले पॉइंटर

var a: i32 = 10;
var b: i32 = 20;
var arr: array<ptr<i32>, 2> = [&a, &b];

println("deref arr[0] = {}, deref arr[1] = {}", deref arr[0], deref arr[1]); // 10, 20

पूरा आकड़ा समूह इंगित करने वाले पॉइंटर

var arr: ptr<array<i32, 3>> = &[1, 2, 3];
println("{}", arr); // मेमोरी एड्रेस आउटपुट

सुरक्षा और स्वामित्व

Wave ने Rust के समान तरीके से स्वामित्व और आयु प्रणाली का परिचय दिया, जिससे पॉइंटर के उपयोग के दौरान मेमोरी की स्थिरता सुनिश्चित होती है। तदनुसार, अमान्य पॉइंटर डिरेफरेंसिंग, दोहरी मुक्त, डैंगलिंग पॉइंटर्स जैसी समस्याओं को रोकने के लिए यह सावधानीपूर्वक जाँच करता है।

मजा मुख्य() {
चलो x: i32 = 42;
चलो p: ptr<i32> = &x;

प्रिंट("x = {}", deref p);

deref p = 99;
प्रिंट("x = {}", x);
}

आउटपुट:

x = 42
x = 99

निष्कर्ष

पॉइंटर्स वेव में उच्च-प्रदर्शन और निम्न-स्तरीय प्रोग्रामिंग को संभव बनाने वाली मुख्य विशेषताओं में से एक है। सिस्टम विकास, देशी पुस्तकालयों, हार्डवेयर नियंत्रण आदि में प्रत्यक्ष मेमोरी नियंत्रण की आवश्यकता वाले क्षेत्रों में बहुत उपयोगी होते हैं, और वेव के सुरक्षित कंपाइलर संरचना की वजह से पॉइंटर उपयोग के दौरान उत्पन्न संभावित खतरों को प्रभावी ढंग से रोक सकते हैं।