Tuesday, September 13, 2022

பாயிண்டர் டு பாயிணடர்.

 



சி மொழியில் பாயிண்டர் என்பது அதே டேட்டா டைப்பை சேர்ந்த மற்றொரு வேரியபிளின் நிணைவக முகவரியை சேமிக்க பயன்படுகின்றது.

பாயிண்டர்கள் மெமரியை ஆக்சஸ் செய்யவும் முகவரியை கையாளவும் பயன்படுகின்றது.

பாயிண்டர்கள் சி மொழியில் தனித்தன்மை வாய்ந்தவை.  இவை சி மொழிக்கு திறனை அளிக்கின்றது. ஆரம்பத்தில் பாயிண்டர்கள் நிரலாளர்களுக்கு குழப்பத்தை ஏற்படுத்தினாலும் இவற்றை புரிந்து கொண்டால் நிரலாகத்தில் நிறைய சாதிக்கலாம்.

 

சி மொழியில் அட்ரஸ்.

 

முதலில் மெமரியின் அட்ரஸ் என்ன என்பதை முதலில் அறிந்து கொள்வோம்.

சி மொழியில் ஒரு வேரியபிள் ஆனது அறிவிக்கப்படும் பொழுது அதற்கு மெமரியில் இடத்தை ஒதுக்குகின்றது.அதற்கு மதிப்பிருத்தப்படும் பொழுது அதில் சேமிக்கப்படுகின்றது.ஒரு வேரியபளின் முகவரியை & ஆபரேட்டர் கொண்டு எளிதாக அறியலாம்.

& ஆபரேட்டர் என்பது அட்ரஸ் ஆஃப் ஆபரேட்டர் என அழைக்கப் படுகின்றது.

var என்பது ஒரு வேரியபிளின் முகவரி என்றால் &var என்பது அதன் முகவரியைக் கொடுக்கின்றது.

#include<stdio.h>

 

void main()

{

    int var = 7;

    printf("Value of the variable var is: %d\n", var);

    printf("Memory address of the variable var is: %x\n", &var);

}

வெளியீடு:

Value of the variable var is: 7

 Memory address of the variable var is: bcc7a00

Scanf() ஃபங்க்சனில் ஒரு வேரியபிளுக்கு இன்புட் வாங்கும் பொழுது வேரியபிள் பெயருக்கும் முன் & ஆபரேட்டரை பயன்படுத்துவோம் அல்லவா அது அந்த வேரியபிளின் மெமரியில் நாம் கொடுக்கும் இன்புட் சேமிக்கப்பட வேண்டும் என்பதற்காகத் தான்.

சான்று

Scanf(“%d”,&var);

பாயிண்டர் கான்செப்ட்

 

ஒரு இன்டிஜெர் வேரியபிள் a என்பதற்கு இன்புட் கொடுக்கப்பட்டு அது சேவ் செய்யப்படுவதாக எடுத்துக் கொள்வோம்.

 

அதன் முகவரி 80f என எடுத்துக்கொள்வோம்.

10 என்ற மதிப்பை அந்த வேரியபிளின் பெயரான a என்பதைக் கொண்டோ அல்லது அதன் முகவரியான 80f என்பதைக் கொண்டோ ஆக்சஸ் செய்யலாம்.

கேள்வி என்னவென்றால் ஒரு வேரியபிளின் மதிப்பை அதம் முகவரிக் கொண்டு எவ்வாறு ஆக்சஸ் செய்வது என்று தான்.

மெமரி அட்ரஸும் எண்கள் தான் என்பதால் அதை மற்றொரு வேரியபிளில் சேவ் செய்யலாம்.

 

ஒரு வேரியபிளின் முகவரியை சேமிக்கப்பயன்படும் வேரியபிள்கள் பாயிண்டர் வேரியபிள் என அழைக்கப்படுகின்றது.

ஆகையால் பாயிண்டர் வேரியபிள் என்பது ஒரு வேரியபிளின் முகவரியை சேமிக்க பயன்படுகின்றது. அந்த பாயிண்டர் வேரியபிளின் மதிப்பு மற்றொரு லொக்கேசனில் சேமிக்கப்படுகின்றது.

 

பாயிண்டர் உபயோக்கிப்பதின் பயன்கள்.

 

1.      பாயிண்டர் ஆனது ஒரு அர்ரேயையும் , ஸ்ட்ரக்சரையும் கையாளுவதில் திறன் வாய்ந்தது.

2.      பாயிண்டர் ஆனது ஒரு ஃபங்க்சனுக்கு ரெஃபெரன்சை அனுப்ப பயன்படுகின்றது.என்வே ஒரு ஃபங்க்சனை மற்றொரு ஃபங்க்சனுக்கு ஆர்க்கியூமெண்டாக அனுப்பலாம்.

3.      ஒரு நிரலின் நீளத்தையும் அதன் இயங்கும் நேரத்தையும் குறைக்கின்றது.

4.      சி மொழியில் டைனமிக் மெமரி ஒதுக்கீடு செய்ய பாயிண்டர்கள் பயன்படுகின்றது.

பாயிண்டர் வேரியபிளை அறிவித்தல்.

 

Datatype *pointer_name;

பாயிண்டரின் டேட்டா டைப்பும் , எந்த வேரியபிளின் முகவரியே சேமிக்கப்போகின்றோமோ அதன் டேட்டா டைப்பும் ஒன்றாக இருத்தல் வேண்டும்.

பாயிண்டர் வேரியபிளுக்கு மதிப்பிருத்தல்.

சி மொழியின் address operator & ஆனது ஒரு வேரியபிளின் முகவரியை ரிடர்ன் செய்கின்றது.

Int a=10;

Int *ptr;     // pointer declaration

Ptr=&a;    // pointer initialization

 

 

 

 

பாயிண்டர் வேரியபிளும் , அது சுட்டும் வேரியபிளும் ஒரே டைப்பாக இல்லா விட்டால் பிழை சுட்டப்படும்.

சான்று

Float a;

Int *ptr=&a     // error type mismatch

பாயிண்டர் வேரியபிளை அறிவித்து விட்டு அதற்கு மதிப்பிருத்தப்படா விட்டால் ஏதாவது கார்பேஜ் மதிப்பை சேமிக்கும். எனவே அதற்கு NULL மதிப்பை ஆரம்பத்தில் இருத்துமாறு பரிந்துரை செய்யப்படுகின்றதுன்

NULL மதிப்பிருத்தப்பட்ட பாயிண்டர் ஆனது நல் பாயிண்டர் என அழைக்கப்படுகின்றது

 

 

பாயிண்டரை டிரெஃபெரென்ஸ் செய்தல்.

 

ஒரு வேரியபிளின் முகவரியை பாயிண்டரில் சேமித்து விட்டு அந்த வேரியபிள் மதிப்பை பெற அதை டிரெஃபெரென்ஸ் செய்ய வேண்டும்.

அதற்கு indirection operator அல்லது dereference operator * பயன்படுகின்றது.

 

சான்று நிரல்.

#include <stdio.h>

 

int main()

{

    int a; 

    a = 10;

    int *p = &a;     // declaring and initializing the pointer

 

    //prints the value of 'a'

    printf("%d\n", *p); 

    printf("%d\n", *&a); 

    //prints the address of 'a'

    printf("%u\n", &a);   

    printf("%u\n", p);    

   

    printf("%u\n", &p);    //prints address of 'p'

   

    return 0;

}

வெளியீடு:

10

10

 3795480300

 3795480300

 3795480304

 

 

பாயிண்டரை பயன்படுத்தும் போது கவனத்தில் கொள்ள வேண்டியவை.

1.      அறிவிக்கும் பொழுதோ அல்லது மதிப்பிருத்தப்படும் பொழுதோ * என்ற சிம்பளை பயன்படுத்தினால் அது பாயிண்டர் வேரியபிள் என்பதைக் குறிக்கின்றது.

2.      ஒரு வேரியபிளின் முன்னால் ஆம்பர்செண்ட் & பயன்படுத்தினால் அது அந்த வேரியபிளின் முகவரியை ரிடர்ன் செய்கின்றது.

3.      Int *a என அறிவிக்கும் பொழுது a என்பது இன்டிஜர் எனக்குறிப்பிட வில்லை அதற்கு மாறாக a என்பது ஒரு இன்டிஜெர் வேரியபிளின் முகவரியை சேமிக்கப்படுகின்றது.

4.      ஒரு வேரியபிளின் மதிப்பைப் பெற பாயிண்டர் வேரியபிளுக்கு முன் * ஆபரேட்டர் பயன்படுகின்றது. இங்கு * என்பது ‘value at’ என்பதைக் குறிக்கின்றது.

 

 

Pointer to pointer  அல்லது double pointer.

 

பாயிண்டர் வேரியபிள் ஆனது மற்றொரு பாயிண்டர் வேரியபிளின் மதிப்பை ஸ்டோர் செய்தால் அது பாயிண்டர் டு பாயிண்டர் அல்லது டபிள் பாயிண்டர் என அழைக்கப்படுகின்றது.

சான்று:

int **p1

 

இங்கு இரண்டு ‘*’ சிம்பள் உள்ளது. இது p1 ஆனது மற்றொரு ஒரு இன்டிஜெர் பாயிண்டரின் முகவரியை சேமிக்கப்பயன் படுகின்றது.

இப்பொழுது p1-ன் முகவரியை ஸ்டோர் செய்ய வேண்டுமென்றால்

அது கீழ்வருமாறு அறிவிக்கப்பட வேண்டும்.

 

int ***p2.

சான்று நிரல்.

#include <stdio.h>

 

int main() {

 

    int  a = 10;

    int  *p1;       //this can store the address of variable a

    int  **p2;

    /*

        this can store the address of pointer variable p1 only.

        It cannot store the address of variable 'a'

    */

 

    p1 = &a;

    p2 = &p1;

 

    printf("Address of a = %u\n", &a);

    printf("Address of p1 = %u\n", &p1);

    printf("Address of p2 = %u\n\n", &p2);

 

    // below print statement will give the address of 'a'

    printf("Value at the address stored by p2 = %u\n", *p2);

   

    printf("Value at the address stored by p1 = %d\n\n", *p1);

 

    printf("Value of **p2 = %d\n", **p2); //read this *(*p2)

 

    /*

        This is not allowed, it will give a compile time error-

        p2 = &a;

        printf("%u", p2);

    */

    return 0;

}

வெளியீடு:

Address of a = 2686724

 Address of p1 = 2686728

 Address of p2 = 2686732

Value at the address stored by p2 = 2686724

Value at the address stored by p1 = 10

 Value of **p2 = 10

 

P1 வேரியபிள் a என்ற வேரியபிளின் முகவரியை மட்டும் ஸ்டோர்

செய்ய முடியும். அதே போல் p2 வேரியபிள் p1-ன் மதிப்பை மட்டும் ஸ்டோர் செய்ய முடியும். P2 ஆனது a-ன் முகவரியை ஸ்டோர் செய்ய முடியாது.

*P2 ஆனது அதில் ஸ்டோர் ஆன p1-ந் மதிப்பை ரிடர்ன் செய்யும்.அதாவது a-ன் முகவரி.

**p2 என்பதை *(*p2) என எடுத்துக் கொள்ளலாம். இதில் **p2 என்பது a-ன் மதிப்பான 10 என்பதை ரிடர்ன் செய்யும்.

பாயிண்டர் மற்றும் அர்ரே

 

சி மொழியில் அர்ரே ஆனது அறிவிக்கப்படும் பொழுது கம்பைலர் ஆனது அதில் ஸ்டோர் செய்ய வேண்டிய எல்லா எலிமென்டிற்கான மெமரியை ஒதுக்கீடு செய்கின்றது.

 

ஒரு அர்ரேயை அறிவித்து மதிப்பிருத்தல்.

Int arr[5]={1,2,3,4,5};

 

 

 

arr என்ற அர்ரேயின் பேஸ் மதிப்பு 1000 என்றால் ஒவ்வொரு எலிமெண்டிற்கும் 2 பைட் மெமரி ஒதுக்கீடு செய்யப்படும்.

வேரியபிள் arr என்பது அந்த அர்ரேயின் முதல் மெம்பரின் அட்ரசைக் குறிக்கும். அதாவது &arr[0].

எனவே இதில் arr என்பது இரண்டாக பயன்படுகின்றது.

1.      இது அர்ரேயின் பெயர்

2.      இது அர்ரேயின் முதல் மெம்பரின் மெமரி அட்ரஸ்.

குறிப்பு

       ஒரு பாயிண்டரை இங்கிரிமெண்ட் செய்யலாம் சான்று p++.

ஆனால் இங்கிரிமெண்ட் செய்யப்பட்ட பாயிண்டரை டிக்ரிமெண்ட் செய்ய இயலாது.அதாவது p—என்பது தவறு.

சான்று   நிரல்.

#include<stdio.h>

 

void main()

{

   int a[3] = {1, 2, 3};

   int *p = a;   

   for (int i = 0; i < 3; i++)

   {

      printf("%d", *p);

      p++;

   }

  return 0;

}

வெளியீடு:

1 2 3

குறிப்பு:

*(a+i) என்பதும் a[i] என்பதும் ஒரே மதிப்பை தான் ரிடர்ன் செய்யும்.

பாயிண்டர் மற்றும் கேரக்டர் ஸ்ட்ரிங்க்ஸ்.

பாயிண்டர் ஸ்டிரிங்குகளை உருவாக்கப்பயன்படுகின்றது.char டைப்பின் பாயிண்டர் வேரியபிள்கள் ஸ்டிரிங்கை உருவாக்க உத்வுகின்றது.

Char *str=”Hello”;

மேலே உள்ள நிரல் வரி str என ஒரு ஸ்ட்ரிங்கை உருவாக்கி அதில் str என்பது முதல் கேரக்டர் H என்பதன் முகவரியை ஸ்டோர் செய்கின்றது.

இயக்க நேரத்திலும் பாயிண்டருக்கு மதிப்பிருத்தலாம்.

char *str;

str=”Hello”;

ஸ்டிரிங்கின் மதிப்பை printf() அல்லது puts() என்ற லைப்ரரி ஃபங்க்சன்கள் கொண்டு பிரிண்ட் செய்யலாம்,.

சான்று:

printf(“%S”, str);

puts(str);

இங்கு str என்பது ஒரு ஸ்ட்ரிங்கின் பெயர் மற்றும் ஒரு ஸ்டிரிங்கின் பாயிண்டர். என்வே இங்கு * என்ற இண்டைரக்சன் ஆபரேட்டரை பயன்படுத்த தேவையில்லை

பாயிண்டர்களின் அர்ரே(array of pointers)

பாயிண்டர் என்பது வெவ்வேறு நீளம் கொண்ட கேரக்டர்அர்ரேக்களை உருவாக்கப்பயன்படுகின்றது.

சான்று:

char *name[3] = {

    "Adam",

    "chris",

    "Deniel"

};

//without pointer

char name[3][20] = {

    "Adam",

    "chris",

    "Deniel"

};

மேலே உள்ள படத்தில் இரண்டாவது அனுகுமுறையில் மெமரி நிறைய வீண் போகின்றது. என்வே இது போன்ற தருணங்களில் பாயிண்டர்களை பயன்படுத்துதல் வல்லது.

நன்றி.

முத்து கார்த்திகேயன், மதுரை

ads Udanz

No comments:

Post a Comment