Sunday, March 1, 2020

Pointers with Array or funcation in C Programming with examples in hindi

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

इससे पहले कि हम C में पॉइंटर्स के बारे में चर्चा करते हैं, एक सरल उदाहरण देता है कि हम यह समझ सकें कि एक चर के पते से हमारा क्या मतलब है।
एक सरल उदाहरण समझने के लिए कि बिना पॉइंटर्स के एक चर के पते तक कैसे पहुंचा जाए?

इस कार्यक्रम में, हमारे पास int प्रकार का एक चर संख्या है। संख्या का मान 10 है और इस मान को मेमोरी में कहीं संग्रहित किया जाना चाहिए, है ना? प्रत्येक चर के लिए एक स्मृति स्थान आवंटित किया जाता है जो उस चर का मान रखता है, इस स्मृति स्थान का एक पता होता है। उदाहरण के लिए हम एक घर में रहते हैं और हमारे घर का एक पता होता है, जो दूसरे लोगों को हमारे घर को खोजने में मदद करता है। उसी तरह से चर का मान मेमोरी पते में संग्रहीत किया जाता है, जो सी प्रोग्राम को उस मूल्य को खोजने में मदद करता है जब इसकी आवश्यकता होती है।

तो मान लें कि वैरिएबल संख्या को निर्दिष्ट किया गया पता 0x7fff5694dc58 है, जिसका अर्थ है कि हम जिस भी मान को num को निर्दिष्ट करने वाले हैं वह स्थान पर संग्रहीत किया जाना चाहिए: 0x7fff5694dc58। नीचे चित्र देखें।

#include <stdio.h>
int main()
{
   int num = 10;
   printf("Value of variable num is: %d", num);
   /* To print the address of a variable we use %p
    * format specifier and ampersand (&) sign just
    * before the variable name like &num.
    */
   printf("\nAddress of variable num is: %p", &num);
   return 0;
}
Output:
Value of variable num is: 10
Address of variable num is: 0x7fff5694dc58


C Pointers in hindi
c programming in hindi

सी में पॉइंटर्स का एक सरल उदाहरण (A Simple Example of Pointers in C)


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

    नोट करने के लिए महत्वपूर्ण बिंदु है: डेटा प्रकार का पॉइंटर और वैरिएबल का मिलान होना चाहिए, एक इंट्री पॉइंटर इंट वैरिएबल के पते को पकड़ सकता है, इसी तरह फ्लोट डेटा टाइप के साथ घोषित पॉइंटर एक फ्लोट वैरिएबल के पते को पकड़ सकता है। नीचे दिए गए उदाहरण में, सूचक और चर दोनों अंतर प्रकार के हैं।

#include <stdio.h>
int main()
{
   //Variable declaration
   int num = 10;

   //Pointer declaration
   int *p;

   //Assigning address of num to the pointer p
   p = #

   printf("Address of variable num is: %p", p);
   return 0;
}
Output:
Address of variable num is: 0x7fff5694dc58

सी पॉइंटर्स - ऑपरेटर्स जो पॉइंटर्स के साथ उपयोग किए जाते हैं (C Pointers – Operators that are used with Pointers)


चलो ऑपरेटरों और सी में पॉइंटर्स के साथ उपयोग किए जाने वाले चर्चा करते हैं।

"का पता" (&) ऑपरेटर (“Address of”(&) Operator)


हम पहले उदाहरण में देख चुके हैं कि हम एम्परसेंड साइन का उपयोग करके एक चर का पता प्रदर्शित कर सकते हैं। मैंने चर संख्या के पते का उपयोग करने के लिए उपयोग किया है। ऑपरेटर को "पताकर्ता" के नाम से भी जाना जाता है।

printf("Address of var is: %p", &num);

ध्यान दें:% p एक प्रारूप निर्दिष्टकर्ता है जिसका उपयोग हेक्स प्रारूप में पता प्रदर्शित करने के लिए किया जाता है।
अब जब आप जानते हैं कि किसी चर का पता कैसे लगाया जा सकता है लेकिन किसी अन्य चर में उस पते को कैसे संग्रहीत किया जाए? वह स्थान जहाँ पॉइंटर्स चित्र में आते हैं। जैसा कि इस गाइड की शुरुआत में उल्लेख किया गया है, सी प्रोग्रामिंग में पॉइंटर्स का उपयोग दूसरे चर के पते को पकड़ने के लिए किया जाता है।

पॉइंटर दूसरे वेरिएबल की तरह है, मुख्य अंतर यह है कि यह एक वैल्यू के बजाय दूसरे वेरिएबल के एड्रेस को स्टोर करता है।

"पता पर मूल्य" (*) ऑपरेटर (“Value at Address”(*) Operator)


* ऑपरेटर को एड्रेस ऑपरेटर के मान के रूप में भी जाना जाता है।

पॉइंटर कैसे घोषित करें (How to declare a pointer?)

int *p1  /*Pointer to an integer variable*/
double *p2  /*Pointer to a variable of data type double*/
char *p3   /*Pointer to a character variable*/
float *p4   /*pointer to a float variable*/

उपरोक्त सूचक घोषणाओं के कुछ उदाहरण हैं। यदि आपको पूर्णांक चर के पते को संग्रहीत करने के लिए एक पॉइंटर की आवश्यकता है तो पॉइंटर का डेटा प्रकार अंतर होना चाहिए। समान मामला अन्य डेटा प्रकारों के साथ है।

* ऑपरेटर का उपयोग करके हम एक पॉइंटर के माध्यम से एक चर के मूल्य तक पहुंच सकते हैं।
उदाहरण के लिए:

double a = 10;
double *p;
p = &a;

p हमें चर का मान देगा। निम्न कथन आउटपुट के रूप में 10 प्रदर्शित करेगा।

printf("%d", *p);

इसी तरह अगर हम इस तरह से * पॉइंटर को एक मान देते हैं

*p = 200;

यह परिवर्तनशील के मान को बदल देगा a। उपरोक्त कथन 10 से 200 के मान को बदल देगा।

Example of Pointer demonstrating the use of & and *

#include <stdio.h>
int main()
{
   /* Pointer of integer type, this can hold the
    * address of a integer type variable.
    */
   int *p;

   int var = 10;

   /* Assigning the address of variable var to the pointer
    * p. The p can hold the address of var because var is
    * an integer type variable.
    */
   p= &var;

   printf("Value of variable var is: %d", var);
   printf("\nValue of variable var is: %d", *p);
   printf("\nAddress of variable var is: %p", &var);
   printf("\nAddress of variable var is: %p", p);
   printf("\nAddress of pointer p is: %p", &p);
   return 0;
}
Output:
Value of variable var is: 10
Value of variable var is: 10
Address of variable var is: 0x7fff5ed98c4c
Address of variable var is: 0x7fff5ed98c4c
Address of pointer p is: 0x7fff5ed98c50

pointer_memory_representation_in_hindi
c in hindi


इसे बेहतर समझने के लिए कुछ और उदाहरण देते हैं -
आओ हम कहते हैं कि हमारे पास एक चर चर और एक सूचक ptr है जो ch का पता रखता है।


char ch='a';
char *ptr;

Read the value of ch

printf("Value of ch: %c", ch);
or
printf("Value of ch: %c", *ptr);

Change the value of ch

ch = 'b';
or
*ptr = 'b';

The above code would replace the value ‘a’ with ‘b’.

Can you guess the output of following C program?

#include <stdio.h>
int main()
{
    int var =10;
    int *p;
    p= &var;

    printf ( "Address of var is: %p", &var);
    printf ( "\nAddress of var is: %p", p);

    printf ( "\nValue of var is: %d", var);
    printf ( "\nValue of var is: %d", *p);
    printf ( "\nValue of var is: %d", *( &var));

    /* Note I have used %p for p's value as it represents an address*/
    printf( "\nValue of pointer p is: %p", p);
    printf ( "\nAddress of pointer p is: %p", &p);

    return 0;
}
Output:
Address of var is: 0x7fff5d027c58
Address of var is: 0x7fff5d027c58
Value of var is: 10
Value of var is: 10
Value of var is: 10
Value of pointer p is: 0x7fff5d027c58
Address of pointer p is: 0x7fff5d027c50


C – Pointer to Pointer (Double Pointer) with example

हम पहले से ही जानते हैं कि एक पॉइंटर एक ही प्रकार के दूसरे चर का पता रखता है। जब एक पॉइंटर दूसरे पॉइंटर का पता रखता है तो इस तरह के पॉइंटर को पॉइंटर-टू-पॉइंटर या डबल पॉइंटर के रूप में जाना जाता है। इस गाइड में, हम सीखेंगे कि डबल पॉइंटर क्या है, उन्हें कैसे घोषित किया जाए और सी प्रोग्रामिंग में उनका उपयोग कैसे किया जाए। इस अवधारणा को समझने के लिए, आपको संकेत की मूल बातें पता होनी चाहिए

How to declare a Pointer to Pointer (Double Pointer) in C?

int **pr;

यहाँ pr एक डबल पॉइंटर है। दोहरे सूचक की घोषणा में दो * होना चाहिए।

आइए एक आरेख की सहायता से दोहरे बिंदुओं की अवधारणा को समझते हैं: 
pointer-to-pointer or double pointer
double pointer representation in hindi

 
आरेख के अनुसार, pr2 एक सामान्य सूचक है जो पूर्णांक चर संख्या का पता रखता है। डायग्राम में एक और पॉइंटर pr1 है जो दूसरे पॉइंटर pr2 का पता रखता है, यहां पॉइंटर pr1 एक पॉइंटर-टू-पॉइंटर (या डबल पॉइंटर) है।

Values from above diagram:

Variable num has address: XX771230
Address of Pointer pr1 is: XX661111
Address of Pointer pr2 is: 66X123X1

Example of double Pointer

Lets write a C program based on the diagram that we have seen above.
#include <stdio.h>
int main()
{
     int num=123;

     //A normal pointer pr2
     int *pr2;

     //This pointer pr2 is a double pointer
     int **pr1;

     /* Assigning the address of variable num to the
      * pointer pr2
      */
     pr2 = #

     /* Assigning the address of pointer pr2 to the
      * pointer-to-pointer pr1
      */
     pr1 = &pr2;

     /* Possible ways to find value of variable num*/
     printf("\n Value of num is: %d", num);
     printf("\n Value of num using pr2 is: %d", *pr2);
     printf("\n Value of num using pr1 is: %d", **pr1);

     /*Possible ways to find address of num*/
     printf("\n Address of num is: %p", &num);
     printf("\n Address of num using pr2 is: %p", pr2);
     printf("\n Address of num using pr1 is: %p", *pr1);

     /*Find value of pointer*/
     printf("\n Value of Pointer pr2 is: %p", pr2);
     printf("\n Value of Pointer pr2 using pr1 is: %p", *pr1);

     /*Ways to find address of pointer*/
     printf("\n Address of Pointer pr2 is:%p",&pr2);
     printf("\n Address of Pointer pr2 using pr1 is:%p",pr1);

     /*Double pointer value and address*/
     printf("\n Value of Pointer pr1 is:%p",pr1);
     printf("\n Address of Pointer pr1 is:%p",&pr1);

     return 0;
}
Output:
Value of num is: 123
Value of num using pr2 is: 123
Value of num using pr1 is: 123
Address of num is: XX771230
Address of num using pr2 is: XX771230
Address of num using pr1 is: XX771230
Value of Pointer pr2 is: XX771230
Value of Pointer pr2 using pr1 is: XX771230
Address of Pointer pr2 is: 66X123X1
Address of Pointer pr2 using pr1 is: 66X123X1
Value of Pointer pr1 is:  66X123X1
Address of Pointer pr1 is: XX661111

इस प्रोग्राम के आउटपुट के बारे में कुछ भ्रम हैं, जब आप इस प्रोग्राम को चलाते हैं तो आपको इसका पता इसी तरह दिखाई देगा: 0x7fff54da7c58। कारण मैंने अलग-अलग प्रारूप में पता दिया है क्योंकि मैं चाहता हूं कि आप इस कार्यक्रम को ऊपर दिए गए आरेख के साथ संबंधित करें। मैंने ऊपर दिए गए आरेख में सटीक पता मानों का उपयोग किया है, ताकि आपके लिए इस कार्यक्रम के आउटपुट को उपरोक्त आरेख के साथ जोड़ना आसान होगा।

आप इन सरल समीकरणों के साथ कार्यक्रम के तर्क को भी समझ सकते हैं:

num == *pr2 == **pr1
&num == pr2 == *pr1
&pr2 == pr1

 

Passing pointer to a function in C with example 

इस ट्यूटोरियल में, आप सीखेंगे कि किसी फ़ंक्शन को एक तर्क के रूप में एक पॉइंटर पास कैसे करें। इस अवधारणा को समझने के लिए आपके पास C प्रोग्रामिंग में पॉइंटर्स और फ़ंक्शंस का एक मूल विचार होना चाहिए।

किसी भी अन्य तर्क की तरह, बिंदुओं को भी एक तर्क के रूप में एक समारोह में पारित किया जा सकता है। यह कैसे किया जाता है यह समझने के लिए एक उदाहरण लेते हैं।
उदाहरण: C प्रोग्रामिंग में एक फ़ंक्शन के लिए पॉइंटर पास करना

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

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

#include <stdio.h>
void salaryhike(int  *var, int b)
{
    *var = *var+b;
}
int main()
{
    int salary=0, bonus=0;
    printf("Enter the employee current salary:"); 
    scanf("%d", &salary);
    printf("Enter bonus:");
    scanf("%d", &bonus);
    salaryhike(&salary, bonus);
    printf("Final salary: %d", salary);
    return 0;
}
Output:
Enter the employee current salary:10000
Enter bonus:2000
Final salary: 12000

Example 2: Swapping two numbers using Pointers 


यह सबसे लोकप्रिय उदाहरणों में से एक है जो दिखाता है कि संदर्भ द्वारा कॉल का उपयोग करके नंबर स्वैप कैसे करें।

    इस प्रोग्राम को पॉइंटर्स के बिना आज़माएं, आप देखेंगे कि नंबर स्वैप नहीं किए गए हैं। कारण वही है जो हमने पहले उदाहरण में देखा है।


#include <stdio.h>
void swapnum(int *num1, int *num2)
{
   int tempnum;

   tempnum = *num1;
   *num1 = *num2;
   *num2 = tempnum;
}
int main( )
{
   int v1 = 11, v2 = 77 ;
   printf("Before swapping:");
   printf("\nValue of v1 is: %d", v1);
   printf("\nValue of v2 is: %d", v2);

   /*calling swap function*/
   swapnum( &v1, &v2 );

   printf("\nAfter swapping:");
   printf("\nValue of v1 is: %d", v1);
   printf("\nValue of v2 is: %d", v2);
}
Output:
Before swapping:
Value of v1 is: 11
Value of v2 is: 77
After swapping:
Value of v1 is: 77
Value of v2 is: 11

C – Function Pointer with examples 

C प्रोग्रामिंग लैंग्वेज में, हम C में फंक्शन पॉइंटर के रूप में जाने जाने वाले एक फंक्शन की ओर Pointer का कांसेप्ट रख सकते हैं। इस ट्यूटोरियल में, हम सीखेंगे कि फंक्शन पॉइंटर कैसे घोषित करें और इस पॉइंटर का उपयोग करके फंक्शन कैसे कॉल करें। इस अवधारणा को समझने के लिए, आपको C में फ़ंक्शंस और पॉइंटर्स का मूल ज्ञान होना चाहिए।

How to declare a function pointer?

function_return_type(*Pointer_name)(function argument list)

For example:

double  (*p2f)(double, char)

यहां डबल एक प्रकार का रिटर्न फ़ंक्शन है, पी 2 एफ फ़ंक्शन पॉइंटर का नाम है और (डबल, चार) इस फ़ंक्शन की एक तर्क सूची है। जिसका अर्थ है कि इस फ़ंक्शन का पहला तर्क डबल प्रकार का है और दूसरा तर्क चार प्रकार का है।

इसे एक उदाहरण की मदद से समझते हैं: यहां हमारे पास एक फ़ंक्शन योग है जो दो संख्याओं के योग की गणना करता है और राशि लौटाता है। हमने एक सूचक f2p बनाया है जो इस फ़ंक्शन को इंगित करता है, हम इस फ़ंक्शन पॉइंटर f2p का उपयोग करके फ़ंक्शन को आमंत्रित कर रहे हैं।

int sum (int num1, int num2)
{
    return num1+num2;
}
int main()
{

    /* The following two lines can also be written in a single
     * statement like this: void (*fun_ptr)(int) = &fun;
     */
    int (*f2p) (int, int);
    f2p = sum;
    //Calling function using function pointer
    int op1 = f2p(10, 13);

    //Calling function in normal way using function name
    int op2 = sum(10, 13);

    printf("Output1: Call using function pointer: %d",op1);
    printf("\nOutput2: Call using function name: %d", op2);

    return 0;
}
Output:
Output1: Call using function pointer: 23
Output2: Call using function name: 23

फ़ंक्शन पॉइंटर के बारे में कुछ बिंदु(Some points regarding function pointer)


1. जैसा कि टिप्पणियों में बताया गया है, आप एक फ़ंक्शन पॉइंटर की घोषणा कर सकते हैं और एक फ़ंक्शन को इस तरह एकल स्टेटमेंट में असाइन कर सकते हैं:

void (*fun_ptr)(int) = &fun;

2. आप इस कथन से एम्परसैंड को हटा भी सकते हैं क्योंकि एक फ़ंक्शन नाम अकेले फ़ंक्शन पते का प्रतिनिधित्व करता है। इसका अर्थ है कि उपरोक्त कथन को इस तरह भी लिखा जा सकता है:

void (*fun_ptr)(int) = fun;

Pointer and Array in C programming with example

 इस गाइड में, हम सीखेंगे कि C प्रोग्राम में पॉइंटर्स और सरणियों के साथ कैसे काम करें। मैं आपको इस गाइड से पहले ऐरे और पॉइंटर ट्यूटोरियल को संदर्भित करने की सलाह देता हूं, ताकि आपके लिए यहां बताई गई अवधारणा को समझना आसान हो जाए।

A simple example to print the address of array elements

#include <stdio.h>
int main( )
{
   int val[7] = { 11, 22, 33, 44, 55, 66, 77 } ;
   /* for loop to print value and address of each element of array*/
   for ( int i = 0 ; i < 7 ; i++ )
   {
      /* The correct way of displaying the address would be using %p format
       * specifier like this:
       * printf("val[%d]: value is %d and address is %p\n", i, val[i], &val[i]);
       * Just to demonstrate that the array elements are stored in contiguous
       * locations, I m displaying the addresses in integer
       */
      printf("val[%d]: value is %d and address is %d\n", i, val[i], &val[i]);
   }
   return 0;
}
Output:
val[0]: value is 11 and address is 1423453232
val[1]: value is 22 and address is 1423453236
val[2]: value is 33 and address is 1423453240
val[3]: value is 44 and address is 1423453244
val[4]: value is 55 and address is 1423453248
val[5]: value is 66 and address is 1423453252
val[6]: value is 77 and address is 1423453256

 ध्यान दें कि प्रत्येक तत्व के बीच 4 बाइट्स का अंतर है क्योंकि यह पूर्णांक का आकार है। जिसका अर्थ है कि सभी तत्व मेमोरी में लगातार सन्निहित स्मृति स्थानों में संग्रहीत हैं। (नीचे चित्र देखें)

उपरोक्त उदाहरण में मैंने सरणी के ith तत्व का पता प्राप्त करने के लिए & i का उपयोग किया है। हम पता प्राप्त करने के लिए ampersand (&) का उपयोग करने के बजाय एक सूचक चर का उपयोग भी कर सकते हैं।

Example – Array and Pointer Example in C

#include <stdio.h>
int main( )
{
   /*Pointer variable*/
   int *p;

   /*Array declaration*/
   int val[7] = { 11, 22, 33, 44, 55, 66, 77 } ;

   /* Assigning the address of val[0] the pointer
    * You can also write like this:
    * p = var;
    * because array name represents the address of the first element
    */
   p = &val[0];

   for ( int i = 0 ; i<7 ; i++ )
   {
      printf("val[%d]: value is %d and address is %p\n", i, *p, p);
      /* Incrementing the pointer so that it points to next element
       * on every increment.
       */
      p++;
   }
   return 0;
}
Output:
val[0]: value is 11 and address is 0x7fff51472c30
val[1]: value is 22 and address is 0x7fff51472c34
val[2]: value is 33 and address is 0x7fff51472c38
val[3]: value is 44 and address is 0x7fff51472c3c
val[4]: value is 55 and address is 0x7fff51472c40
val[5]: value is 66 and address is 0x7fff51472c44
val[6]: value is 77 and address is 0x7fff51472c48

Points to Note:


1) एरे के साथ पॉइंटर्स का उपयोग करते समय, पॉइंटर का डेटा प्रकार एरे के डेटा प्रकार के साथ मेल खाना चाहिए।
2) आप पॉइंटर को इस तरह से इनिशियलाइज़ करने के लिए ऐरे नाम का भी उपयोग कर सकते हैं: 

p = var;

क्योंकि सरणी नाम अकेले सरणी के आधार पते के बराबर है।

val==&val[0];

3) लूप में इंक्रीमेंट ऑपरेशन (p ++) पॉइंटर वैरिएबल पर किया जाता है ताकि अगली लोकेशन (अगला एलिमेंट की लोकेशन) मिल सके, यह अंकगणित सभी प्रकार के एरे के लिए (सभी डेटा टाइप्स के लिए डबल, चार, इंट आदि) समान है। भले ही प्रत्येक डेटा प्रकार द्वारा खपत बाइट्स अलग हैं।

सूचक तर्क (Pointer logic)

आप उपरोक्त कोड में तर्क को समझ गए होंगे इसलिए अब कुछ सूचक अंकगणित और अभिव्यक्तियों के साथ खेलने का समय है। 


if p = &val[0] which means
*p ==val[0]
(p+1) == &val[2]  & *(p+1) == val[2]
(p+2) == &val[3]  & *(p+2) == val[3]
(p+n) == &val[n+1) & *(p+n) == val[n+1]

 इस तर्क का उपयोग करके हम अपने कोड को इस तरह से फिर से लिख सकते हैं:

#include <stdio.h>
int main( )
{
   int *p;
   int val[7] = { 11, 22, 33, 44, 55, 66, 77 } ;
   p = val;
   for ( int i = 0 ; i<7 ; i++ )
   {
      printf("val[%d]: value is %d and address is %p\n", i, *(p+i), (p+i));
   }
   return 0;
}

हमें इस कार्यक्रम में p ++ कथन की आवश्यकता नहीं है।

0 Comments:

Post a Comment