सी प्रोग्रामिंग में संकेत: क्या सूचक, प्रकार और amp है; उदाहरण

विषय - सूची:

Anonim

C में Pointer क्या है?

सूचक सी में, एक चर कि दुकानों अन्य चर का पता है। एक पॉइंटर का उपयोग दूसरे पॉइंटर फ़ंक्शन को संदर्भित करने के लिए भी किया जा सकता है। एक पॉइंटर को अगले / पिछले मेमोरी लोकेशन पर इंगित करने के लिए बढ़ा / घटाया जा सकता है। पॉइंटर का उद्देश्य मेमोरी स्पेस को बचाना और तेजी से निष्पादन समय प्राप्त करना है।

सी में पॉइंटर्स का उपयोग कैसे करें

यदि हम एक प्रकार का int v घोषित करते हैं, तो v वास्तव में एक वैल्यू स्टोर करेगा।

v अभी शून्य के बराबर है।

हालांकि, मूल्य के अलावा प्रत्येक चर का भी अपना पता (या, सीधे शब्दों में कहें, जहां यह मेमोरी में स्थित है) है। चर नाम से पहले एक एम्परसेंड (और) लगाकर पते को पुनः प्राप्त किया जा सकता है।

यदि आप स्क्रीन पर एक चर के पते को प्रिंट करते हैं, तो यह पूरी तरह से यादृच्छिक संख्या (इसके अलावा, यह रन से रन के लिए अलग हो सकता है) जैसा दिखेगा।

आइए, सी उदाहरण में सूचक के साथ व्यवहार में यह प्रयास करें

इस कार्यक्रम का आउटपुट -480613588 है।

अब, एक सूचक क्या है? मान को संग्रहीत करने के बजाय, एक सूचक एक चर के पते को संग्रहीत करेगा।

सूचक चर

इंट * y = & v;

परिवर्तनशील

सूचक

एक नामित भंडारण / स्मृति पते में संग्रहीत मान

एक चर कि करने के लिए अंक के भंडारण / स्मृति पता एक और चर

एक सूचक की घोषणा

चर की तरह, C प्रोग्रामिंग में पॉइंटर्स को आपके प्रोग्राम में उपयोग किए जाने से पहले घोषित किया जाना चाहिए। जब तक वे C के नामकरण नियमों का पालन करते हैं, तब तक पॉइंटर्स को कुछ भी नाम दिया जा सकता है। एक सूचक घोषणा के निम्नलिखित रूप हैं।

data_type * pointer_variable_name;

यहाँ,

  • data_type पॉइंटर का आधार प्रकार C का वैरिएबल प्रकार है और पॉइंटर के प्रकार को इंगित करता है जो पॉइंटर को इंगित करता है।
  • तारांकन चिह्न (*: गुणन के लिए प्रयुक्त वही तारांकन) जो अप्रत्यक्ष परिचालक है, एक सूचक की घोषणा करता है।

आइए देखते हैं इस सी पॉइंटर्स ट्यूटोरियल में कुछ मान्य पॉइंटर घोषणाएँ:

int *ptr_thing; /* pointer to an integer */int *ptr1,thing;/* ptr1 is a pointer to type integer and thing is an integer variable */double *ptr2; /* pointer to a double */float *ptr3; /* pointer to a float */char *ch1 ; /* pointer to a character */float *ptr, variable;/*ptr is a pointer to type float and variable is an ordinary float variable */

एक सूचक को प्रारंभ करें

पॉइंटर घोषित करने के बाद, हम इसे वैरिएबल एड्रेस की तरह स्टैंडर्ड वेरिएबल की तरह इनिशियलाइज़ करते हैं। यदि C प्रोग्रामिंग में पॉइंटर्स को असंगठित और प्रोग्राम में उपयोग नहीं किया जाता है, तो परिणाम अप्रत्याशित और संभावित रूप से विनाशकारी होते हैं।

एक चर का पता प्राप्त करने के लिए, हम एम्परसेंड (और) ऑपरेटर का उपयोग करते हैं, एक चर के नाम से पहले रखा जाता है जिसका पता हमें चाहिए। पॉइंटर इनिशियलाइज़ेशन निम्नलिखित सिंटैक्स के साथ किया जाता है।

सूचक वाक्य रचना

 pointer = &variable; 

सूचक चित्रण के लिए एक सरल कार्यक्रम नीचे दिया गया है:

#include int main(){int a=10; //variable declarationint *p; //pointer variable declarationp=&a; //store address of variable a in pointer pprintf("Address stored in a variable p is:%x\n",p); //accessing the addressprintf("Value stored in a variable p is:%d\n",*p); //accessing the valuereturn 0;}

आउटपुट:

Address stored in a variable p is:60ff08Value stored in a variable p is:10
ऑपरेटर जिसका अर्थ है
* 2 उद्देश्य से कार्य करता है
  1. एक सूचक की घोषणा
  2. संदर्भित चर का मान लौटाता है
और केवल 1 उद्देश्य में कार्य करता है
  • एक चर का पता देता है

सी में पॉइंटर्स के प्रकार

सी में पॉइंटर्स के विभिन्न प्रकार निम्नलिखित हैं :

नल पॉइंटर

हम सूचक घोषणा के दौरान अशक्त मान असाइन करके एक अशक्त सूचक बना सकते हैं। यह विधि तब उपयोगी होती है जब आपके पास सूचक को निर्दिष्ट कोई पता नहीं होता है। एक अशक्त सूचक में हमेशा मान 0 होता है।

निम्नलिखित कार्यक्रम एक शून्य सूचक के उपयोग को दर्शाता है:

#include int main(){int *p = NULL; //null pointerprintf(“The value inside variable p is:\n%x”,p);return 0;}

आउटपुट:

The value inside variable p is:0

शून्य सूचक

C प्रोग्रामिंग में, एक शून्य पॉइंटर को जेनेरिक पॉइंटर भी कहा जाता है। इसका कोई मानक डेटा प्रकार नहीं है। एक शून्य सूचक कीवर्ड शून्य का उपयोग करके बनाया गया है। इसका उपयोग किसी भी चर के पते को संग्रहीत करने के लिए किया जा सकता है।

निम्नलिखित कार्यक्रम एक शून्य सूचक के उपयोग को दर्शाता है:

#include int main(){void *p = NULL; //void pointerprintf("The size of pointer is:%d\n",sizeof(p));return 0;}

आउटपुट:

The size of pointer is:4

जंगली सूचक

एक पॉइंटर को वाइल्ड पॉइंटर कहा जाता है अगर इसे किसी भी चीज़ के लिए इनिशियलाइज़ नहीं किया जा रहा है। इस प्रकार के C पॉइंटर्स कुशल नहीं होते हैं क्योंकि वे कुछ अज्ञात मेमोरी लोकेशन को इंगित कर सकते हैं जिससे हमारे प्रोग्राम में समस्या हो सकती है और इससे प्रोग्राम क्रैश हो सकता है। जंगली संकेत के साथ काम करते समय हमेशा सावधान रहना चाहिए।

निम्नलिखित कार्यक्रम जंगली सूचक के उपयोग को दर्शाता है:

#include int main(){int *p; //wild pointerprintf("\n%d",*p);return 0;}

उत्पादन

timeout: the monitored command dumped coresh: line 1: 95298 Segmentation fault timeout 10s main

'C' में अन्य प्रकार के संकेत निम्नानुसार हैं:

  • खतरनाक संकेत
  • जटिल सूचक
  • सूचक के पास
  • दूर का सूचक
  • विशाल सूचक

प्रत्यक्ष और अप्रत्यक्ष एक्सेस पॉइंटर्स

C में, चर सामग्री तक पहुँचने और हेरफेर करने के दो बराबर तरीके हैं

  • सीधी पहुंच: हम सीधे चर नाम का उपयोग करते हैं
  • अप्रत्यक्ष पहुंच: हम चर के लिए एक सूचक का उपयोग करते हैं

आइए नीचे दिए गए कार्यक्रम की मदद से इसे समझते हैं

#include /* Declare and initialize an int variable */int var = 1;/* Declare a pointer to int */int *ptr;int main( void ){/* Initialize ptr to point to var */ptr = &var;/* Access var directly and indirectly */printf("\nDirect access, var = %d", var);printf("\nIndirect access, var = %d", *ptr);/* Display the address of var two ways */printf("\n\nThe address of var = %d", &var);printf("\nThe address of var = %d\n", ptr);/*change the content of var through the pointer*/*ptr=48;printf("\nIndirect access, var = %d", *ptr);return 0;}

कार्यक्रम को बिना किसी त्रुटि के संकलित करने के बाद, परिणाम है:

Direct access, var = 1Indirect access, var = 1The address of var = 4202496The address of var = 4202496Indirect access, var = 48

सी में सूचक अंकगणित

पॉइंटर संचालन को निम्नलिखित आकृति में संक्षेपित किया गया है

सूचक संचालन

प्राथमिकता ऑपरेशन (पूर्वता)

सी पॉइंटर्स के साथ काम करते समय, हमें निम्नलिखित प्राथमिकता नियमों का पालन करना चाहिए:

  • ऑपरेटरों * और & # 839; एक ही प्राथमिकता के रूप में एक्री संचालकों (नकार !, वेतन वृद्धि ++, गिरावट) है।
  • एक ही अभिव्यक्ति में, एकात्मक संचालक *,;,;, ++, - का मूल्यांकन दाईं से बाईं ओर किया जाता है।

यदि कोई P पॉइंटर एक X वैरिएबल की ओर इशारा करता है, तो * P को जहाँ भी X लिखा जा सकता है, प्रयोग किया जा सकता है।

निम्नलिखित अभिव्यक्तियाँ समतुल्य हैं:

int X = 10 int * P = & Y; उपरोक्त कोड के लिए, नीचे के भाव सत्य हैं
की अभिव्यक्ति समतुल्य अभिव्यक्ति
Y = * P + 1 * P = * P + 10 * P + = 2 ++ * P (* P) ​​++ Y = X + 1 X = X + 10 X + = 2 ++ X X ++

उत्तरार्द्ध मामले में, कोष्ठकों की आवश्यकता होती है: जैसा कि एकात्मक संचालक * और ++ का मूल्यांकन दाईं से बाईं ओर किया जाता है, बिना कोष्ठक के सूचक P का अंकन होगा, जिस पर P अंक नहीं है।

नीचे दी गई तालिका अंकगणितीय और मूल ऑपरेशन को दर्शाती है जिसका उपयोग सी पॉइंटर्स के साथ काम करते समय किया जा सकता है

ऑपरेशन व्याख्या
असाइनमेंट int * P1, * P2 P1 = P2; P1 और P2 एक ही पूर्णांक चर की ओर इशारा करते हैं
वृद्धि और क्षय इंट * पी 1; P1 ++; P1--;
एक ऑफसेट जोड़ना (लगातार) इससे पॉइंटर एन तत्वों को एक तालिका में स्थानांतरित करने की अनुमति देता है। चर के प्रकार के बाइट (नों) की संख्या से N को पॉइंटर को बढ़ाया या घटाया जाएगा। पी 1 + 5;

उदाहरण के साथ सी पॉइंटर्स और एरे

परंपरागत रूप से, हम इसके इंडेक्स का उपयोग करके एरे तत्वों को एक्सेस करते हैं, लेकिन पॉइंटर्स का उपयोग करके इस विधि को समाप्त किया जा सकता है। पॉइंटर्स प्रत्येक एरे तत्व को एक्सेस करना आसान बनाते हैं।

#include int main(){int a[5]={1,2,3,4,5}; //array initializationint *p; //pointer declaration/*the ptr points to the first element of the array*/p=a; /*We can also type simply ptr==&a[0] */printf("Printing the array elements using pointer\n");for(int i=0;i<5;i++) //loop for traversing array elements{printf("\n%x",*p); //printing array elementsp++; //incrementing to the next element, you can also write p=p+1}return 0;}

उत्पादन

12345

एक पॉइंटर में एक विशेष संख्या जोड़ने से पॉइंटर स्थान को एक अतिरिक्त ऑपरेशन द्वारा प्राप्त मूल्य पर ले जाया जाएगा। मान लीजिए कि पी एक ऐसा पॉइंटर है जो वर्तमान में मेमोरी लोकेशन 0 की ओर इशारा करता है।

सूचक जोड़ / वृद्धि

चूँकि p वर्तमान में 1 जोड़ने के बाद स्थान 0 की ओर इशारा करता है, इसलिए मान 1 हो जाएगा, और इसलिए सूचक स्मृति स्थान 1 को इंगित करेगा।

C पॉइंटर्स एंड स्ट्रिंग्स विद एग्ज़ाम्पल्स

एक स्ट्रिंग वर्ण वस्तुओं की एक सरणी है, एक अशक्त चरित्र '\ 0' के साथ समाप्त होती है। हम संकेत का उपयोग करते हुए तारों में हेरफेर कर सकते हैं। C उदाहरण में यह सूचक इस खंड की व्याख्या करता है

#include #include int main(){char str[]="Hello Guru99!";char *p;p=str;printf("First character is:%c\n",*p);p =p+1;printf("Next character is:%c\n",*p);printf("Printing all the characters in a string\n");p=str; //reset the pointerfor(int i=0;i

उत्पादन

First character is:HNext character is:ePrinting all the characters in a stringHelloGuru99!

स्ट्रिंग्स से निपटने का एक और तरीका निम्न प्रोग्राम में पॉइंटर्स की एक सरणी के साथ है:

#include int main(){char *materials[ ] = { "iron", "copper", "gold"};printf("Please remember these materials :\n");int i ;for (i = 0; i < 3; i++) {printf("%s\n", materials[ i ]);}return 0;}

आउटपुट:

Please remember these materials:ironcoppergold

सी में पॉइंटर्स का लाभ

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

सी में पॉइंटर्स का नुकसान

  • संकेत समझने के लिए थोड़ा जटिल हैं।
  • संकेत विभिन्न दोषों जैसे विभाजन दोषों को जन्म दे सकते हैं या एक स्मृति स्थान तक पहुंच सकते हैं जिसकी आवश्यकता नहीं है।
  • यदि एक पॉइंटर को गलत मान प्रदान किया जाता है, तो यह स्मृति भ्रष्टाचार का कारण हो सकता है।
  • मेमोरी लीकेज के लिए पॉइंटर्स भी जिम्मेदार होते हैं।
  • सूचक तुलनात्मक रूप से चर की तुलना में धीमे हैं।
  • प्रोग्रामर को पॉइंटर्स के साथ काम करना बहुत मुश्किल लगता है; इसलिए यह प्रोग्रामर की जिम्मेदारी है कि वह एक पॉइंटर को ध्यान से देखें।

सारांश

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