Types of Pointers in C as it is…!

पोस्ट ला नाव असं का दिल असेल?

आपण लहानपणा पासून बघत आहोत, ऐकत आहोत “भगद्वतगीता – जशी आहे तशी”… ना आपण ती वाचतो, समजा अगदीच ती वाचली तर ना आपणाला ती समजते, आणी समजा ती समजली तर आपल्याला समजण्याची पद्धत हि दुसऱ्यापेक्षा वेगळी असू शकते कारण श्रीकृष्णाचे रुपं च तसं होत अर्जुना ला दिसलेलं…! असो…

मी या पोस्ट मध्ये Types of pointers in C वर लिहायचं ठरवलयं…

ज्या व्हेअरेबल मध्ये दुसऱ्या व्हेअरेबल चा address ठेवता येतो अशा प्रकारच्या व्हेअरेबल ला पॉइंटर व्हेअरेबल म्हणतात इतकी सोपी व सरळ व्याख्या असुन सुद्धा पॉइंटर वापरतांना झालेला गोंधळ हा प्रोग्रॅमरच्या पाचवीला पुजलेला असतो.

Bhagavad-Gita

शिवाय भगवद्गगीते मध्ये जशी कृष्णाची अनंत रुपे अर्जुनासमोर उभी रहातात त्याच प्रमाणे पॉइंटरची वेगवेगळी रुपं सुद्धा C प्रोग्रॅमरला दिसत जातात.

मनात आलं म्हणून हि पोस्ट लिहीते आहे… हि सगळी रुपं मला ज्या प्रमाणे दिसली तशी…!

आकर्षक images टाकून TV किंवा Newspaper प्रमाणे TRP वाढवण्याचा माझा मुळीच उद्देश नाही पण मी ज्यावेळी पॉइंटर ला बघते त्यावेळी मला तो श्रीकृष्णासारखाच दिसतो म्हणून हि image टाकली…! 🙂

Integer/float/character pointer

C language मधील बेसीक डेटा-टाइप असला व त्याच्या व्हेअरेबल्सचा address ठेवायचा असला तर तुम्हाला corresponding प्रकारचा पॉइंटर म्हणजेच पॉइंटर व्हेअरेबल लागते. जसे की या तीन व्हेअरेबल्स चे पॉइंटर्स कसे आहेत पहा या प्रोग्रॅम मध्ये दिसेल…

खरं तर पॉइंटर हा derived data type. म्हणजेच basic data type  पासून तयार झालेला किंवा केलेला म्हणा हवं तर. म्हणून की काय डेनीस ने star (*) operator हा पॉइंटर डिक्लेअर करण्यासाठी सुचवला. डिक्लेअर करण्यासाठी तोच व पॉइंटर ज्या ठिकाणी पॉइंट करतो त्या ठिकाणची व्हॅल्यु मिळवण्यासाठी सुद्धा तोच. म्हणजे star operator याच ठिकाणी double role करतोय. शिवाय binary operator या रुपात काम करतांना तो multiplication operator म्हणून सुद्धा काम करतो…

आता integer pointer, character pointer, float pointer हि पॉइंटर्सची साधी-भोळी रुपं… पण हि खरं तर वादळापुर्वीची शांतता असते कारण खरे रंग तो नंतर दाखवायला सुरवात करतो ज्यावेळी तुम्ही प्रथम array शिकतांना भेटता त्यावेळी.

Array च्या पहील्या element च्या address ला base address म्हणतात व तो array च्या नावामध्ये स्टोअर केला जातो किंवा असतो असे काहीतरी तुमच्या कानावर पडते. तुमच्या पॉइंटर विषयीच्या ज्ञानाला पहीला सुरुंग बसतो तो या ठिकाणी… तो धक्का सुद्धा तुम्ही कष्टाने पचवता. पण तेवढ्यात पॉंइटर arithmetic हा प्रकार तुमच्या नजरेला येतो. त्या ठिकाणी अनेक विद्यार्थ्यांची जी घसरण सुरू होते ती शेवटपणे थांबत नाही कारण त्या नंतर तुमच्या कानावर double dimensional array, string manipulation, structure pointer येउन पडतात व तुम्ही अर्धमेले व्हायला सुरवात होते. शेवटी file pointer हा जो काही येतो तो तुम्हाला पुर्ण नेस्तानाबूत करूनच शांत होतो. 🙁

त्या नंतर मग तुम्ही जे काही शिकता म्हणजे उदा. Dynamic memory allocation मध्ये भेटणार void pointer, data structure मध्ये लागणारे next, previous, first नावाचे pointer, dangling pointer हे जणू तुम्ही तटस्थ वृत्तीने ऐकायला (शिकायला अथवा समजायला नव्हे) सुरवात करता. अर्थात तुमच्या कडे दुसरा मार्गही नसतो हे लक्षात घ्या…! या व्यतिरीक्त function pointer, far pointer, huge pointer, near pointer, wild pointer अशा प्रकारचे जे काही आहेत ते आपण नंतर कधीतरी शिकुया व आत्ता Java सारखी pointer-free language शिकुन मोकळे होउया असा विचार करता…! असो मी या सर्व पॉइंटरची ओळख तुम्हाला करून देणार आहे. ओळख करून घ्यायची कि नाही हे तुम्ही ठरवा… मी तुम्हाला भेटीला घेउन येते ठरावीक अंतराने…

तर मग कशी आहेत रुपं आहेत या सर्व पॉइंटरची…?

आपण सुरवात constant pointer पासून करू…

Constant pointer

विद्यार्थी array शिकतात, स्ट्रिंग टॉपीक शिकतात. प्रोग्रॅम्स सुद्धा लिहीतात. व स्ट्रक्चर, फाईल हॅंडलींग शिकुन मोकळे होतात. पण

#include<stdio.h>
int main()
{

int num[ 5 ] = { 3, 4, 5, 6, 7 };
int i;

for(i=1;i<=5;i++)
{

printf(“%d…”,*num);
num++;

            }

return 0;

}

आणी

#include<stdio.h>
int main()
{

char name[50];
name = “C Programming”;

puts(name);

return 0;

}

या दोनही प्रोग्रॅमचे आउटपुट विचारले की सांगायला मात्र चुकतात. हे दोनही प्रोग्रॅम कंपाइल टाइम एरर देतात त्याचे कारण म्हणजे कॉंन्स्टंट पॉइंटर असते. तुम्ही ज्यावेळी array व स्ट्रिंग डिक्लेअर करता त्यावेळी पहील्या प्रोग्रॅम मध्ये num या array च्या नावामध्येच व स्ट्रिंग च्या name मध्ये array चा base address ठेवण्याचे काम automatically केले जाते. हा पॉंईटर internally तयार करण्याचा उद्योग कंपायलर करत असतो. व हा कॉंन्स्टंट पॉइंटर कॅटेगरीत मोडतो. त्या कारणामुळेच तुम्ही स्ट्रिंग initialize करू शकता, स्कॅन करू शकता पण assignment करू शकत नाही. कारण हा पॉइंटर साधा पॉइंटर नसतो तर कॉंन्स्टंट पॉइंटर असतो. त्यामुळे तो दुसरीकडे पॉइंट करू शकत नाही… हा खाली दिलेला प्रोग्रॅम काळजीपुर्वक पहा. तसेच num++ करू शकत नाही कारण num हा सुद्धा constant pointer या category मध्ये येतो.

अशा प्रकारचा pointer तुम्ही सुद्धा डिक्लेअर करू शकता. जसे की…

int x = 5;
int y = 10
const int *ptr = &x;

*ptr = 20;                                 // invalid
printf(“%d”,x);

मात्र या ठिकाणी const ची position मात्र महत्वाची आहे. कारण जर तुम्ही हाच प्रोग्रॅम

int x = 5;
int y = 10;
int *const ptr = &x;

*ptr = 20;                                 // valid

ptr = &y;                                  // invalid
printf(“%d”,x);

असा लिहीला तर त्याचा अर्थ बदलतो. वर दिलेली दोन examples मध्ये array च्या नावामध्ये base address स्टोअर करतांना जो पॉइंटर internally तयार केला जातो त्याची जातकुळ या पॉइंटर सारखी असते

हे सर्व चांगल्या पद्धतीने समजण्यासाठी मी लिहीलेला Interpreting complex C declarations हि पोस्ट तुम्ही वाचली तर मी काय म्हणते आहे ते तुम्हाला कळेल.

या पोस्टमध्ये मी इतकेच लिहीते. पुढील पोस्ट मध्ये Null Pointer वर सविस्तर चर्चा करते.

Leave a Reply