Saturday 11 June 2016

c மொழியும் பாயிண்டர்ஸும்




பாயிண்டர் எனப்படுவது என்ன?


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

பாயிண்டரின் நண்மைகள்


1.நிரலின் இயக்க நேரத்தில் நினைவகத்தை கையாளுதல்
2.அர்ரேயையும் ஸ்ட்ரக்டையும் எளிமையாக கையாளுதல்
3.ஒரு ஃபங்சனை மற்றொரு ஃபங்சனுக்கு பராமீட்டராக அனுப்புவதற்கு உதவுகின்றது

பாயிண்டர்ஸ் பற்றிய கருத்து:

 


உதாரணத்துக்கு x என்கின்ற int டேட்டா டைப் வேரியபிளை அறிவித்து அதற்கு 10 என்கின்ற எண்ணை மதிப்பித்திருத்துவதாக வைத்து கொள்வோம்.
 int x=10;
இப்போது வேரியபிளின் பெயர் x . அதில் 10 என்கின்ற எண் சேமிக்கப்பட்டுள்ளது. ஆனால் x என்கின்ற வேரியபிளுக்கு ஒரு நினைவக முகவரி இருக்கும். உதாரணத்து 2002 என்று வைத்துக் கொள்வோம். இந்த முகவரியை மற்றொரு வேரியபிளில் சேமிக்கலாம். அந்த வேரியபிளை பாயிண்டர் வேரியபிள் என்கின்றோம்.
இதைப் பற்றி தொடர்வதற்கு முன்  இரண்டு ஆப்பரேட்டர்களைப் பற்றி சிறிய அறிமுகம்.
&-Address of operator
*--value of operator
உதாரணத்துக்கு x என்பது ஒரு வேரியபிளின் பெயர் எனில் &x என்பது x-ன் முகவரியைக் குறிக்கும்.
ஒரு பாயிண்டர் வேரியபிள் ஆனது அறிவிக்கப்படும் பொழுது அது எந்த வகையான டேட்டா வேரியபிளின் முகவரியை சேமிக்கின்றதோ அதன் வகையிலேயே அதுவும் அறிவிக்கப்பட வேண்டும். மேலும் பெயர்க்கு முன்னால் * என்னும் குறியீடும் சேர்க்கப்பட வேண்டும்.
Int x;
int *p
p=&x
இதுவே float டேட்டா டைப் வேரியபிளின் முகவரியை சேமிப்பதாய் இருந்தால் பாயிண்டரும்  float டைப்பிலேயே அறிவிக்கப்பட வேண்டும்.
float a;
float *pt;
pt=&a;
இப்போது x என்கின்ற int டைப் முகவரி 2002 என்று வைத்துக் கொள்வோம்.
அதன் மதிப்பை x என்கின்ற பெயரை வைத்தோ அல்லது 2002 என்கின்ற முகவரியை வைத்தோ கையாளலாம்.

பாயிண்டரை dereference செய்தல்:


ஒரு தடவை பாயிண்டரில் மற்றொரு வேரியபிளின் முகவரியை சேமித்து விட்டால் அந்த வேரியபிளின் மதிப்பை பாயிண்டரை * என்கின்ற value of operator கொண்டு dereference செய்யலாம்.
int x,*Ptr;
x=10;
ptr=&x;
printf(“value of x=%d”, *ptr);
கீழ் கண்ட வரியும் x-ன் மதிப்பையே காண்பிக்கும்.
printf(“value of x=%d”,*(&x));
உதாரண முழு நிரல்
#include<stdio.h>
#include<conio.h>
void main()
{
int a=10;
int *p;
p=&a;
clrscr();
printf(“The value of a is %d\n”, a);
printf(“Address of a is %p\n”,&a);
printf(“The value  of a is i.e *(&a) %d\n”,*(&a));
printf(“The memory Address stored in pointer p is %p\n”,p);
printf(“The value pointed by pointer p is %d\n”,*p);
printf(“Address of pointer p is %p\n”,&p);
getch();
}

வெளியீடு:


The value of a is 10
Address of a is fff4
The value  of a is i.e *(&a) 10
The memory Address stored in pointer p is fff4
The value pointed by pointer p is 10
Address of pointer p is fff2

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


அர்ரேயானது அது அறிவிக்கப்படும் பொழுது போதுமான நினைவகத்தை ஒதுக்குகின்றது.அதன் base address எனப்படுவது அர்ரேயின் முதல் உறுப்பின் முகவரி ஆகும். base address ஆனதை பாயிண்டர் வேரியபிளில் சேமிப்பதன் மூலம் அர்ரேயை எளிதாக கையாளலாம்.
உதாரணத்துக்கு int a[5]={10,20,30,40,50};
இதில்
a[0] என்பது  10ஐ குறிக்கும்.
&a[0] என்பது முதல் உறுப்பின் முகவரியை குறிக்கும்.
அதே சமயம் a என்பதும் முதல் உறுப்பின் முகவரியைக் குறிக்கும்.
int i;
int a[5] = {10, 20, 30, 40, 50};
int *p = a; 
for (i=0; i<5; i++)
{
 printf("%d ", *p);
 p++;
}
வெளியீடு:
10 20 30 40 50

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


பாயிண்டர் மூலம் ஸ்ட்ரிங்குகளையும் உருவாக்கலாம். char –டைப் பாயிண்டர்கள் ஸ்ட்ரிங்குகளாக ஏற்க்கப்படுகின்றது.
char *str=”welcome”;
str-ன் மதிப்பை பின் வருமாறு ப்ரிண்ட் செய்யலாம்.
printf(“%s”,str);
அல்லது
puts(str);

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


பாயிண்டர்களுக்கு அர்ரேயையும் உருவாக்கலாம்
எடுத்துக்காட்டாக
char *sname[3]={
“ram”,”ganesh”,”ravi”};
இதுவே பாயிண்டர்களை உபயோகிக்காமல் கேரக்டர் அர்ரேயை உருவாக்க வேண்டுமென்றால்
char sname[3][10]={ “ram”,”ganesh”,”ravi” };
இரண்டாவது முறையில் ஒவ்வொரு உறுப்பிக்கும் 10 பிட் மெமரி கட்டாயமாக ஒதுக்கப்படுகின்றது. பாயிண்டர்ஸ் மூலம் உருவாக்கப்படும் முதல் முறையில் அவ்வாறு கிடையாது இதன் மூலம் நினைவகம் மீதப்படுத்தப்படுகின்றது.

ஸ்ட்ரக்சரின் பாயிண்டர்கள்


நம்மால் ஸ்ட்ரக்சர் வேரியபிளுக்கும் அர்ரே உருவாக்க முடியும். அவ்வாறு உருவாக்கப்படும் அர்ரேயை பாயிண்டர் மூலம் எளிதாய் கையாளலாம்.
struct Book
{
 char name[5];
 int price;
}
 
int main()
{
 struct Book b1;       //Single structure variable
 struct Book* ptr;    //Pointer of Structure type
 ptr = &b1;
 
 struct Book b[10];     //Array of structure variables
 struct Book* p;        //Pointer of Structure type
 p = &b;    
}
நாம் பொதுவாக ஸ்ட்ரக்சர் வேரியபிளின் மதிப்பை அணுக . ஆப்பரேட்டரை உபயோகிப்போம். அதே நேரம் ஸ்ட்ரக்சர் பாயிண்டரில்(->) ஆரோ மார்க் ஆப்பரேட்டரை உபயோகிக்கலாம்.
struct Book
{
 char name[10];
 int price;
}
 
int main()
{
 struct Book b1;
 struct Book* ptr = &b1;   
 ptr->name = "Muthu karthikeyan";      //Accessing Structure Members
 ptr->price = 200;
}

 

பாயிண்டர்ஸுக்கு பாயிண்டர்ஸ்(pointers to pointer)


எப்படி ஒரு சாதாரண வேரியபிளின் முகவரியை மற்றொரு வேரியபிளில் சேமிக்க முடியுமோ அதே போல் ஓரு பாயிண்டர் வேரியபிளின்ன் முகவரியையும் மற்றொரு வேரியபிளில் சேமிக்க முடியும். அந்த வேரியபிள் பாயின்டர் டூ பாயிண்டர் என அழைக்கப்படுகின்றது.
அந்த வேரியபிள் ஆனது அறிவிக்கப்படும் போது இரண்டு * குறியீடுடன் டைப் செய்யப்படுகின்றது.
 
எடுத்துக்காட்டு நிரல்
 
#include<stdio.h>
#include<conio.h>
void main()
{
int a=10;
int *p;
int **pp;
p=&a;
pp=&p;
printf(“The value of a is %d\n",a);
printf("Address of a is %u\n",&a);
printf("Value of p is %u\n",p);
printf("The address of p is %u\n",&p);
printf("The value pointed by pointer p is %d\n",*p);
printf("The value of pp is %u\n",pp);
printf("The Address of pp is %u\n",&pp);
printf("The value of a by using pointer to pointer i.e **pp is %d",**pp);
getch();
}
வெளியீடு:
The value of a is 10
Address of a is 65524
Value of p is 65524
The address of p is 65522
The value pointed by pointer p is 10
The value of pp is 65522
The Address of pp is 65520
The value of a by using pointer to pointer i.e **pp is 10
 
                                     முத்து கார்த்திகேயன்,மதுரை

No comments:

Post a Comment