- 1 1. परिचय
- 2 2. पोइन्टर भेरिएबल के हो?
- 3 4. एरे र पोइन्टरको सम्बन्ध
- 4 5. कार्यहरू र पोइन्टरहरू
- 5 6. प्वाइन्टरको अनुप्रयोग उदाहरण
- 6 7. सामान्य त्रुटिहरू र तिनीहरूको समाधान
- 7 8. सारांश
1. परिचय
C भाषा सिक्दा टाढा नजानेको कुरा 「प्वाइन्टर भेरिएबल」को बुझाइ हो। शुरुआतीहरूका लागि 「एड्रेस」 वा 「इन्डाइरेक्ट रेफरेन्स」जस्ता अवधारणाहरू कठिन लाग्न सक्छ, तर प्वाइन्टर C भाषाको मूलभूत महत्त्वपूर्ण तत्व हो, र यसलाई प्रयोग गर्न सकिएमा अझ उन्नत प्रोग्रामिङ सम्भव हुन्छ।
यस लेखमा, 「प्वाइन्टर भेरिएबल भनेको के हो?」 भन्ने आधारबाट, व्यावहारिक कोड उदाहरणहरू, साथै एरे र फङ्सनसँगको सम्बन्ध, अनुप्रयोगात्मक प्रयोगसम्म, क्रमिक रूपमा बिस्तारपूर्वक व्याख्या गर्नेछौं। विशेष शब्दहरूको अर्थ र कार्यको छवि सजिलै बुझ्न, चित्रण र नमुना कोडहरू पनि समावेश गर्दै अघि बढ्नेछौं, त्यसैले C भाषा अझै परिचित नभएका व्यक्तिहरू पनि निश्चिन्ततापूर्वक पढ्न सक्नुहुनेछ।
प्वाइन्टर भनेको, एक पटक अभ्यस्त भए अत्यन्त शक्तिशाली र उपयोगी कार्य हो। गतिशील मेमोरी अपरेसन वा फङ्सनमा मानको पासिङ जस्ता कार्यहरूले प्रोग्रामको दायरा ठूलो बनाउँछन्। यस लेखमार्फत प्वाइन्टर भेरिएबलको बुझाइलाई गहिरो बनाइ, C भाषामा विकास कौशललाई एक चरण उकास्न सक्नुहुन्छ भने खुशी हुनेछौं।
2. पोइन्टर भेरिएबल के हो?
पॉइन्टर भेरिएबलको मूल अवधारणा
सी भाषामा पोइन्टर भेरिएबल भनेको, 「मेमोरीमा ठेगाना भण्डारण गर्ने भेरिएबल」 हो। सामान्य भेरिएबलले डेटा आफैलाई भण्डारण गर्छ भने, पोइन्टरलेअर्को भेरिएबल भण्डारण भएको स्थान (ठेगाना) सम्झन्छ।
उदाहरणका लागि, तलको जस्तो कोड विचार गरौं।
int a = 10;
int *p = &a;
यस अवस्थामा, भेरिएबलa
मा मान 10 भण्डारण हुन्छ, रp
माa
को ठेगाना भण्डारण हुन्छ।*p
लेखेर,p
ले संकेत गरेको ठेगानामा रहेको मान (यस अवस्थामा 10) लाई अप्रत्यक्ष रूपमा सन्दर्भ गर्न सकिन्छ।
ठेगाना र मेमोरीको सम्बन्ध
सबै डेटा कम्प्युटरको मेमोरीमा भण्डारण हुन्छ। र, मेमोरीमा प्रत्येक बाइटलाई ठेगाना दिइएको हुन्छ। पोइन्टरले, यो ठेगाना जानकारी प्रयोग गरेर「कुन मेमोरी स्थानलाई सञ्चालन गर्ने」निर्धारण गर्ने माध्यम हो।
पॉइन्टर प्रयोग गरेर, तलका जस्ता कार्यहरू सम्भव हुन्छन्।
- फङ्क्सनहरू बीचमा भेरिएबलको सामग्रीलाई प्रत्यक्ष रूपमा परिवर्तन गर्ने
- एरेका तत्वहरूलाई लचिलो रूपमा सञ्चालन गर्ने
- हीप मेमोरी प्रयोग गरेर गतिशील मेमोरी व्यवस्थापन
अर्थात, पोइन्टर भनेको सी भाषाको लचिलोपन र कम-स्तरको नियन्त्रण शक्ति समर्थन गर्ने महत्वपूर्ण प्रणाली हो।
पॉइन्टर भेरिएबलको घोषणा र आरम्भिकरण
पॉइन्टर भेरिएबललाई, लक्ष्य डेटा प्रकारमा एस्टरिस्क(*
)जोडेर घोषणा गरिन्छ।
int *p; // int प्रकारको भेरिएबललाई सूचक गर्ने पोइन्टर
char *c; // char प्रकारको भेरिएबललाई सूचक गर्ने पोइन्टर
र, सामान्यतया &
अपरेटर प्रयोग गरेर, अन्य भेरिएबलको ठेगाना असाइन गरिन्छ।
int a = 5;
int *p = &a; // a को ठेगाना p मा भण्डारण गर्नुहोस्
यहाँ महत्वपूर्ण कुरा यो हो कि, 「पॉइन्टरको प्रकार」 र 「पॉइन्टरले संकेत गर्ने मानको प्रकार」 मिल्नुपर्छ। int
प्रकारलाई संकेत गर्ने पोइन्टरमा char
प्रकारको ठेगाना असाइन गर्दा, कार्यसम्पादन ग्यारेन्टी नहुन सक्छ।
@@ गर्दा प्रयोग गरिन्छ。
int a = 10;
int *p = &a;
printf("%d
", *p); // परिणाम: 10
यसरी,*p
लेखेर,a
को मान(सामग्री)लाई इन्डाइरेक्ट रूपमा प्राप्त गर्न सकिन्छ। उल्टो, तल लेखे जस्तै मान परिवर्तन पनि सम्भव छ।
*p = 20;
printf("%d\n", a); // परिणाम: 20
मान प्राप्ति र परिवर्तन:पोइन्टरको प्रयोग उदाहरण
पोइन्टर प्रयोग गरेर,अर्को फङ्सनबाट भेरिएबलको मान सिधै परिवर्तन गर्न सकिन्छ। तल यसको आधारभूत उदाहरण छ।
void updateValue(int *p) {
*p = 100;
}
int main() {
int num = 50;
updateValue(#);
printf("%d
", num); // परिणाम: 100
return 0;
}
यसरी, फङ्सनभित्र मान अद्यावधिक गर्दा पनि पोइन्टर सक्रिय हुन्छ। C भाषा मा,फङ्सनलाई मान पास गर्दा सामान्यतया प्रतिलिपि(मान पास) हुन्छ, तर पोइन्टर प्रयोग गरेरमूल मानलाई नै सञ्चालन गर्न सम्भव हुन्छ।
पोइन्टरको जोड र घटाउ
पोइन्टरले,जोड/घटाउ गर्न सक्छ। यो एरेहरू वा निरन्तर मेमोरी क्षेत्रहरूलाई ह्यान्डल गर्दा अत्यन्त उपयोगी हुन्छ।
int arr[3] = {10, 20, 30};
int *p = arr;
printf("%d
", *p); // 10
p++;
printf("%d
", *p); // 20
यहाँ महत्वपूर्ण कुरा भनेको, “p++
” गर्दा,अर्को int प्रकारको भेरिएबलको एड्रेसमा सर्नु हो। int प्रकार 4 बाइट भएमा,p++
ले एड्रेसमा “+4” हुन्छ।
यसरी, पोइन्टरको आधारभूत सञ्चालन बुझ्नाले, C भाषामा मेमोरी सञ्चालनको आधार निर्माण गर्ने पहिलो कदम हो। अर्को अध्यायमा, पोइन्टर र एरेको सम्बन्धलाई अझ विस्तृत रूपमा हेरौं।
4. एरे र पोइन्टरको सम्बन्ध
C भाषा मा、एरे र पोइन्टरहरू अत्यन्त नजिकको सम्बन्धमा छन्।शुरुआतीहरूका लागि यो भ्रमित हुने बिन्दु हुन सक्छ, तर यो सम्बन्धलाई बुझेर, अधिक लचिलो र प्रभावकारी एरे अपरेसन सम्भव हुन्छ।
एरेको नामलाई पोइन्टर जस्तै व्यवहार गर्न सकिन्छ
C भाषा मा,एरेको नामपहिलो तत्वको ठेगाना देखाउने पोइन्टरको रूपमा व्यवहार गरिन्छ। उदाहरणका लागि तलको कोड हेर्नुहोस्।
int arr[3] = {10, 20, 30};
printf("%d\n", *arr); // परिणाम: 10
त्यो समयमा、arr
ले&arr[0]
सँग समान ठेगाना देखाउँछ, र *arr
ले एरेको पहिलो तत्व(arr[0]
)जनाउँछ।
पोइन्टर प्रयोग गरेर एरेको पहुँच
एरेलाई इन्डेक्सले पहुँच गर्न सकिन्छ, तर पोइन्टर प्रयोग गरेर पनि समान अपरेसन सम्भव छ।
int arr[3] = {10, 20, 30};
int *p = arr;
printf("%d
", p[1]); // परिणाम: 20
यहाँ、p[1]
ले*(p + 1)
सँग समान अर्थ हुन्छ।अर्थ-? Actually:
printf("%d
", *(arr + 2)); // Result: 30
यसरी、इन्डेक्स नोटेशन र पोइन्टर गणना मूलतः समान काम गरिरहेका छन्।
पोइन्टर सञ्चालन र एरे इन्डेक्सको भिन्नता
एरे र पोइन्टर समान छन्, तर पूर्ण रूपमा समान छैन भन्ने कुरा पनि ध्यान दिनु आवश्यक छ।
1. आकारको प्राप्ति
एरेको नाम प्रयोग गर्दा, यसको आकारलाईsizeof
द्वारा प्राप्त गर्न सकिन्छ, तर पोइन्टरमा असाइन गर्दा आकार गुम्छ।
int arr[5];
int *p = arr;
printf("%zu
", sizeof(arr)); // परिणाम: 20 (5×4 बाइट)
printf("%zu
", sizeof(p)); // परिणाम: 8 (64bit वातावरणमा प्वाइन्टर 8 बाइट हुन्छ)
2. लेखन परिवर्तन गर्न सकिने कि नसकिने
एरेको नाम स्थिर पोइन्टर जस्तै हो,असाइनमेन्ट द्वारा परिवर्तन गर्न सकिँदैन।
int arr[3];
int *p = arr;
p = p + 1; // OK
arr = arr + 1; // त्रुटि (एरे नाम पुनः असाइन गर्न सकिँदैन)
पोइन्टर र एरेलाई कुशलतापूर्वक प्रयोग गर्नुका फाइदाहरू
- पोइन्टर प्रयोग गर्दा、मेमोरी स्पेसलाई लचिलो रूपमा सञ्चालनगर्न सकिन्छ
- एरे प्रोसेसिंग छिटो र प्रभावकारी हुन्छ(इन्डेक्स भन्दा पोइन्टर गणना अलिकति छिटो हुन सक्छ)
- फङ्क्शनमा एरे पास गर्दा、वास्तविक डेटा होइन, केवल पहिलो ठेगाना मात्र पास गरिन्छछ, पोइन्टरको रूपमा ज्ञान अनिवार्य छ
5. कार्यहरू र पोइन्टरहरू
C भाषा मा, कार्यमा चललाई पास गर्दा, मान पास(call by value) मूलभूत हो। त्यसैले, कार्यभित्र आर्गुमेन्ट परिवर्तन गरे पनि, मूल चलमा असर पर्दैन। तर, पोइन्टर प्रयोग गरेर कार्यबाट मूल चलको मानलाई सिधै सञ्चालन गर्न सम्भव हुन्छ।
यस अध्यायमा, कार्य र पोइन्टरको सम्बन्ध, मान परिवर्तन गर्ने तरिका, कार्य पोइन्टरको आधारभूत आदि, कार्यमा पोइन्टरको प्रयोगलाई व्याख्या गर्नेछौं।
पोइन्टर प्रयोग गरेर मान परिवर्तन
पहिले, कार्यभित्र चलको मान परिवर्तन गर्न चाहनुहुन्छ भने, पोइन्टर प्रयोग गर्न आवश्यक हुन्छ।
उदाहरण: पोइन्टर बिना अवस्थामा
void update(int x) {
x = 100;
}
int main() {
int a = 10;
update(a);
printf("%d
", a); // परिणाम: 10 (परिवर्तित छैन)
return 0;
}
यस अवस्थामा, कार्यलाई a
को प्रतिलिपि पास गरिएको कारण, a
आफैँ परिवर्तन हुँदैन।
उदाहरण: पोइन्टर प्रयोग गर्ने अवस्थामा
void update(int *x) {
*x = 100;
}
int main() {
int a = 10;
update(&a);
printf("%d
", a); // परिणाम: 100 (परिवर्तित हुनेछ)
return 0;
}
यसरी, चलको ठेगाना कार्यमा पास गरेर, मूल मान परिवर्तन गर्न सकिन्छ। यो “सन्दर्भ पास(call by reference)” को प्रविधिको रूपमा व्यापक रूपमा प्रयोग हुन्छ।
एरे र कार्यको सम्बन्ध
C भाषा मा, एरेलाई कार्यमा पास गर्दा स्वचालित रूपमा पोइन्टरको रूपमा ह्यान्डल गरिन्छ। अर्थात, एरेको पहिलो तत्वको ठेगाना कार्यमा पास गरिन्छ, जसले कार्यभित्र सामग्री परिवर्तन सम्भव बनाउँछ।
void setValues(int *arr, int size) {
for (int i = 0; i < size; i++) {
arr[i] = i * 10;
}
}
int main() {
int nums[3];
setValues(nums, 3);
printf("%d\n", nums[1]); // परिणाम: 10
return 0;
}
यस उदाहरण जस्तै, एरेको नामलाई सोझै पास गर्दा कार्यभित्रबाट सामग्री परिवर्तन गर्न सकिन्छ।
कार्य पोइन्टरको आधारभूत
C भाषा मा, कार्यको ठेगाना चलमा संग्रह गरेर कल गर्न पनि सकिन्छ। यसलाई कार्य पोइन्टर भनिन्छ।
घोषणा र प्रयोग उदाहरण:
int add(int a, int b) {
return a + b;
}
int main() {
int (*funcPtr)(int, int); // int प्रकारको मान फर्काउने, दुई int तर्क लिने फङ्सन पोइन्टर
funcPtr = add;
int result = funcPtr(3, 4);
printf("%d
", result); // परिणाम: 7
return 0;
}
कार्य पोइन्टरलाई, गतिशील रूपमा कार्य चयन गरेर चलाउन चाहँदा वा कलब्याक कार्यको कार्यान्वयन आदि मा प्रयोग गरिन्छ। कार्यको नाम मात्रले पनि कार्यको ठेगाना प्राप्त गर्न सकिने कारण, लचिलो प्रोग्रामिङ सम्भव हुन्छ।
व्यावहारिक प्रयोग दृश्य
- एरेको क्रमबद्धता(सोर्ट) मा, तुलना कार्यलाई पोइन्टरद्वारा पास गर्नु
- मेनु चयन प्रकारको प्रोग्राम मा, विकल्प अनुसार चलाउने कार्यलाई कार्य पोइन्टरद्वारा व्यवस्थापन
- इभेन्ट-ड्राइभन प्रोसेसिङ वा कलब्याक कार्य को कार्यान्वयन(GUI、एम्बेडेड、गेम विकास आदि)
6. प्वाइन्टरको अनुप्रयोग उदाहरण
प्वाइन्टरको आधारभूत प्रयोग बुझिसकेपछि, अब अनुप्रयोगात्मक प्रयोग विधिहरू सिकौं। C भाषा को प्वाइन्टर, गतिशील मेमोरी अपरेसन र उन्नत डेटा संरचनाको कार्यान्वयनमा अनिवार्य छ। यस अध्यायमा, व्यावहारिक रूपमा बारम्बार प्रयोग हुने अनुप्रयोगात्मक प्रविधिहरू मध्ये 3 वटा प्रस्तुत गरिन्छ।
गतिशील मेमोरी आवंटन(malloc
र free
)
C भाषामा, कार्यसम्पादन समयमा आवश्यक मेमोरीलाई गतिशील रूपमा आवंटन गर्न सकिन्छ। यसलाई सम्भव बनाउने कुरा मानक पुस्तकालयको malloc
फलन हो। आवंटित मेमोरी प्वाइन्टरद्वारा सन्दर्भित हुन्छ, र प्रयोग समाप्त भएपछि free
द्वारा मुक्त गर्न आवश्यक छ।
उदाहरण: पूर्णांकलाई गतिशील रूपमा आवंटन गर्ने
#include <stdio.h>
#include <stdlib.h>
int main() {
int *p = (int *)malloc(sizeof(int)); // एक int प्रकारको मेमोरी सुरक्षित गर्नुहोस्
if (p == NULL) {
printf("मेमोरी सुरक्षित गर्न असफल भयो
");
return 1;
}
*p = 123;
printf("%d
", *p); // परिणाम: 123
free(p); // मेमोरी मुक्त गर्नुहोस्
return 0;
}
ध्यान दिनु पर्ने बुँदा:
malloc
ले आवंटित मेमोरीको आवंटित मेमोरीको सुरुको ठेगाना फिर्ता गर्छ- रिटर्न मानलाई सधैं NULL जाँच गर्नुहोस्
- मेमोरी प्रयोग समाप्त भएपछि
free
द्वारा अनिवार्य रूपमा मुक्त गर्नुहोस्
यसरी, आवश्यक समयमा आवश्यक मात्र मेमोरी आवंटन गर्न सक्ने कुरा प्वाइन्टर प्रयोग गरेर गतिशील मेमोरी व्यवस्थापनको आकर्षण हो।
प्वाइन्टरको प्वाइन्टर (डबल प्वाइन्टर)
प्वाइन्टरको ठेगाना राख्ने प्वाइन्टर, अर्थात् “प्वाइन्टरको प्वाइन्टर” पनि C भाषामा प्रायः प्रयोग हुन्छ। विशेष गरी, फलनभित्र प्वाइन्टर परिवर्तन गर्न चाहँदा वा द्वि-आयामिक एरेको अपरेसनमा उपयोगी हुन्छ।
उदाहरण: फलनभित्र प्वाइन्टरलाई आरम्भ गर्ने
void allocate(int **pp) {
*pp = (int *)malloc(sizeof(int));
if (*pp != NULL) {
**pp = 42;
}
}
int main() {
int *p = NULL;
allocate(&p);
printf("%d
", *p); // परिणाम: 42
free(p);
return 0;
}
प्रायः प्रयोग हुने परिस्थितिहरू:
- द्वि-आयामिक एरे
- संरचनामा परिवर्तनशील लम्बाइको एरे राख्दा
- बहु स्ट्रिङहरूलाई ह्यान्डल गर्ने(char *argv आदि)
फलन प्वाइन्टर र एरेको संयोजन
फलन प्वाइन्टरलाई एरेको रूपमा राखी, परिस्थितिअनुसार गतिशील रूपमा फलनलाई स्विच गरी कल गर्ने जस्ता उन्नत प्रविधिहरू पनि C भाषामा सामान्य छन्।
उदाहरण: सरल मेनु चयन
#include <stdio.h>
void hello() { printf("Hello"); }
void bye() { printf("Goodbye"); }
int main() {
void (*funcs[2])() = {hello, bye};
int choice = 0;
printf("0: hello, 1: bye > ");
scanf("%d", &choice);
if (choice >= 0 && choice < 2) {
funcs[choice](); // फङ्क्शन कल
}
return 0;
}
यस्ता डिजाइनहरू, अवस्था व्यवस्थापन र इभेन्ट-ड्राइभन प्रोग्रामहरूमा पनि उपयोगी हुन्छ।
प्वाइन्टर प्रयोग गरेर अनुप्रयोगात्मक प्रविधिहरूले केवल कोड लेख्ने क्षमताभन्दा पनि, मेमोरी र कार्यसम्पादन नियन्त्रणलाई ध्यानमा राख्ने डिजाइन क्षमताको आवश्यकता पर्छ। तर, यदि यसलाई दक्षतापूर्वक प्रयोग गर्न सकियो भने, C भाषाको शक्ति पूर्ण रूपमा उपयोग गर्न सकिन्छ।

7. सामान्य त्रुटिहरू र तिनीहरूको समाधान
प्वाइन्टर एक अत्यन्त शक्तिशाली सुविधा हो, तर यसको प्रयोग गलत तरिकाले गर्दा बगहरू र सुरक्षा खालिहरूको कारण बन्न सक्छ। यस अध्यायमा, C भाषामा प्वाइन्टर प्रयोग गर्दा प्रायः देखा पर्ने त्रुटिहरू र तिनीहरूलाई रोक्नका उपायहरू बारे व्याख्या गरिन्छ।
अप्रारम्भिक प्वाइन्टरको प्रयोग
सबैभन्दा आधारभूत तर जोखिमपूर्ण कुरा भनेको, अप्रारम्भिक प्वाइन्टर प्रयोग गर्ने केस हो। प्वाइन्टर केवल घोषणा गरे मात्र मान्य ठेगाना संकेत गर्दैन।
खराब उदाहरण:
int *p;
*p = 10; // अनिर्दिष्ट व्यवहार! p ले कहिल्यै पनि कति पनि सूचक छैन
उपाय:
- प्वाइन्टरलाईअवश्य प्रारम्भिक गरेर प्रयोग गर्नुहोस्
- प्रयोग गर्नु अघि
NULL
जाँच गर्नुहोस्
int *p = NULL;
// प्रयोग गर्नु अघि मेमोरी सुरक्षित गर्नुहोस् वा वैध ठेगाना असाइन गर्नुहोस्
NULL प्वाइन्टरको उल्टो सन्दर्भ
प्वाइन्टरलेNULL
संकेत गरिरहेको अवस्थामा *p
प्रयोग गर्दा, प्रोग्राम क्र्यास हुन्छ। यो अत्यन्त सामान्य बग हो।
उदाहरण:
int *p = NULL;
printf("%d
", *p); // रनटाइम त्रुटि (सेग्मेन्टेशन फॉल्ट आदि)
उपाय:
- प्वाइन्टरले
NULL
नभएको कुरा जाँच गरेर प्रयोग गर्नुहोस्
if (p != NULL) {
printf("%d
", *p);
}
मेमोरी लीक
डायनामिक रूपमा सुरक्षित गरिएको मेमोरीलाईfree
गर्न बिर्सिएमा, मेमोरी नछोडी संकलन हुने “मेमोरी लीक” उत्पन्न हुन्छ। लामो समय चल्ने प्रोग्रामहरू वा एम्बेडेड प्रणालीहरूमा यो घातक हुन्छ।
उदाहरण:
int *p = (int *)malloc(sizeof(int));
// प्रक्रिया समाप्त भएपनि free नगर्नुहोस् → memory leak
उपाय:
- प्रयोग समाप्त भएपछिअवश्य
free
गर्नुहोस् malloc
रfree
को मिलानलाई ध्यान दिनुहोस्- विकासको क्रममा मेमोरी लीक पत्ता लगाउने उपकरणहरू (उदाहरण: Valgrind) प्रयोग गर्नुहोस्
ड्याङ्ग्लिङ प्वाइन्टर
free
पछि मेमोरीलाई संकेत गर्ने प्वाइन्टरलाई “ड्याङ्ग्लिङ प्वाइन्टर” भनिन्छ, र पुन: प्रयोग गर्दा अपरिभाषित व्यवहार उत्पन्न हुन्छ।
उदाहरण:
int *p = (int *)malloc(sizeof(int));
free(p);
*p = 123; // त्रुटि! पहिले नै मुक्त गरिएको मेमोरीमा पहुँच
उपाय:
free
पछि सधैँ NULL असाइन गरेर अमान्य बनाउनुहोस्
free(p);
p = NULL;
एरे बाहिर पहुँच
प्वाइन्टर प्रयोग गरेर इन्डेक्स गणनामा, अनजानेमा एरेको सीमा पार गर्न सक्छ। यो पनि अत्यन्त जोखिमपूर्ण छ, र बग तथा कमजोरीको कारण बन्छ।
उदाहरण:
int arr[3] = {1, 2, 3};
printf("%d
", *(arr + 3)); // अनिर्धारित व्यवहार (arr[3] अस्तित्वमा छैन)
उपाय:
- सधैँवैध दायरा भित्र पहुँच गरिरहेको छ कि छैन जाँच गर्नुहोस्
- लूप प्रक्रियामा “सीमा जाँच” लाई कडाइका साथ लागू गर्नुहोस्
एउटै प्वाइन्टरलाई दोहोरो मुक्त गर्ने
एउटै मेमोरी ठेगानालाई free
गर्ने कार्यलाई २ पटक गर्दा, प्रोग्राम क्र्यास हुने जोखिम हुन्छ।
उपाय:
free
पछि प्वाइन्टरलाई NULL मा सेट गरेर, दोहोरो मुक्तलाई रोक्न
free(p);
p = NULL;
यी त्रुटिहरूलाई, मूलभूत नियमहरू पालना गरेर र सावधानीपूर्वक कोडिङ गरेर रोक्न सकिन्छ। विशेष गरी शुरुआतीहरूका लागि, “प्रारम्भिकरण”, “NULL जाँच”, “free को कडाइ” लाई नियमको रूपमा पालना गर्नु बग‑रहित कोडमा परिणत हुन्छ।
8. सारांश
C भाषा मा、प्वाइन्टर भेरिएबल सबैभन्दा आधारभूत भएता पनि गहिरो र महत्वपूर्ण तत्व हो। यस लेखमा, 「प्वाइन्टर के हो?」 भन्ने आधारभूत कुरा देखि, एरे・फङ्क्शन・मेमोरी व्यवस्थापन・फङ्क्शन प्वाइन्टर जस्ता प्रयोगात्मक उदाहरणहरू सम्म क्रमशः व्याख्या गरिएको छ।
सिकेका बुँदाहरूको पुनरावलोकन
- प्वाइन्टर भेरिएबल डेटा को ठेगाना भण्डारण गर्ने भेरिएबल हो,
*
(परामिटर)र&
(ठेगाना अपरेटर)द्वारा सञ्चालन गरिन्छ। - एरे र प्वाइन्टर नजिकै सम्बन्धित छन्, एरेको नामलाई सुरु ठेगाना देखाउने प्वाइन्टरको रूपमा प्रयोग गर्न सकिन्छ।
- फङ्क्शन र प्वाइन्टरलाई संयोजन गर्दा, फङ्क्शन भित्र भेरिएबललाई प्रत्यक्ष रूपमा सञ्चालन गर्ने「रेफरेंस पास」सम्भव हुन्छ, फङ्क्शन प्वाइन्टर प्रयोग गरेर लचिलो फङ्क्शन कल पनि सम्भव हुन्छ।
- डायनामिक मेमोरी व्यवस्थापन(malloc/free) र डबल प्वाइन्टर जस्ता प्रविधिहरूले अझ व्यावहारिक र लचिलो प्रोग्राम डिजाइनलाई समर्थन गर्छ।
- तर, अनइनिशियलाइज्ड प्वाइन्टर・NULL रेफरेंस・मेमोरी लीक・ड्यांग्लिङ प्वाइन्टर जस्ता प्वाइन्टर विशेष त्रुटिहरू धेरै छन्, जसका लागि सावधानीपूर्वक ह्यान्डलिंग आवश्यक छ।
नविन प्रयोगकर्ताहरूको लागि सल्लाह
प्वाइन्टरलाई「कठिन」「डर लाग्ने」जस्ता धारणाहरू गरिन्छ, तर त्यो कारण हो कि यसलाई ब्ल्याकबक्सको रूपमा प्रयोग गरिन्छ।ठेगानाको अर्थ र मेमोरीको संरचना राम्ररी बुझेर, असुरक्षा आत्मविश्वासमा परिवर्तन हुन्छ।।
तलका चरणहरू अनुसार सिकाइलाई दृढ बनाउने राम्रो हुन्छ:
- नमूना कोडलाईकागज र चित्रमा हातले लेखेर पछ्याउने
printf
द्वारा ठेगाना र मानलाईदृश्यात्मक गरी जाँच गर्नेValgrind
जस्तामेमोरी जाँच उपकरणहरूलाई उपयोग गर्ने- सानोप्वाइन्टर अपरेसन अभ्यास कार्यक्रमलाई धेरै लेख्ने प्रयास गर्नुहोस्।
अर्को चरणमा
यस लेखमा प्रस्तुत सामग्रीले C भाषा को प्वाइन्टरको आधारभूतदेखि मध्यवर्ती स्तरसम्म समेटेको छ। भविष्यमा बुझाइलाई अझ गहिरो बनाउन, तलका विषयहरूमा जानु राम्रो हुनेछ।
- स्ट्रक्चर र प्वाइन्टर
- प्वाइन्टर प्रयोग गरेर स्ट्रिङ अपरेसन
- फाइल इनपुट/आउटपुट र प्वाइन्टर
- बहु-आयामिक एरेको अपरेसन
- फङ्क्शन प्वाइन्टर प्रयोग गरेर कलब्याक डिजाइन
प्वाइन्टरलाई बुझेर, C भाषाको वास्तविक रोचकता र शक्ति महसुस गर्न सकिन्छ। सुरुमा केही भ्रमित हुन सक्छ, तर क्रमशः निश्चित रूपमा बुझाइलाई जोड्दै जाऔं। यो लेखले तपाईंलाई सहयोग पुर्याउँछ भने खुशी हुनेछ।