अब तक शून्य सूचक पर मेरी समझ इस प्रकार है।
जब कोई पॉइंटर वैरिएबल कीवर्ड शून्य का उपयोग करके घोषित किया जाता है - तो यह एक सामान्य उद्देश्य पॉइंटर वैरिएबल बन जाता है। किसी भी डेटा प्रकार (चार, इंट, फ्लोट आदि) के किसी भी चर का पता एक शून्य सूचक चर को सौंपा जा सकता है।
main()
{
int *p;
void *vp;
vp=p;
}
चूंकि अन्य डेटा प्रकार पॉइंटर को पॉइंटर पॉइंटर को सौंपा जा सकता है, इसलिए मैंने इसका उपयोग निरपेक्ष_वल्यू (नीचे दिखाया गया कोड) फ़ंक्शन में किया। एक सामान्य कार्य करने के लिए।
मैंने एक सरल सी कोड लिखने की कोशिश की जो पूर्णांक लेता है या तर्क के रूप में तैरता है और नकारात्मक होने पर इसे + ve बनाने की कोशिश करता है। मैंने निम्नलिखित कोड लिखा है,
#include<stdio.h>
void absolute_value ( void *j) // works if used float, obviously it must work but thats not my interest here.
{
if ( *j < 0 )
*j = *j * (-1);
}
int main()
{
int i = 40;
float f = -40;
printf("print intiger i = %d \n",i);
printf("print float f = %f \n",f);
absolute_value(&i);
absolute_value(&f);
printf("print intiger i = %d \n",i);
printf("print float f = %f \n",f);
return 0;
}
लेकिन मुझे त्रुटि हो रही थी, इसलिए मुझे पता चला कि शून्य सूचक के साथ मेरी समझ सही नहीं है :( इसलिए अब मैं बिंदुओं को इकट्ठा करने की दिशा में आगे बढ़ूंगा ऐसा क्यों है।
शून्य बिंदुओं पर मुझे जो चीजें समझने की जरूरत है, वह यह है।
हमें इसे अलग करने के लिए शून्य पॉइंटर वैरिएबल को टाइप करना होगा। ऐसा इसलिए है क्योंकि एक शून्य पॉइंटर में कोई डेटा प्रकार नहीं होता है जो इसके साथ जुड़ा होता है। ऐसा कोई तरीका नहीं है जिससे कंपाइलर (या अनुमान लगा सके?) किस प्रकार के डेटा को शून्य पॉइंटर द्वारा इंगित किया गया है। तो एक शून्य सूचक द्वारा इंगित किए गए डेटा को लेने के लिए हम इसे शून्य बिंदु स्थान के अंदर पकड़े गए सही प्रकार के डेटा के साथ टाइप करते हैं।
void main()
{
int a=10;
float b=35.75;
void *ptr; // Declaring a void pointer
ptr=&a; // Assigning address of integer to void pointer.
printf("The value of integer variable is= %d",*( (int*) ptr) );// (int*)ptr - is used for type casting. Where as *((int*)ptr) dereferences the typecasted void pointer variable.
ptr=&b; // Assigning address of float to void pointer.
printf("The value of float variable is= %f",*( (float*) ptr) );
}
एक शून्य सूचक वास्तव में उपयोगी हो सकता है यदि प्रोग्रामर अंत उपयोगकर्ता द्वारा इनपुट किए गए डेटा प्रकार के डेटा के बारे में निश्चित नहीं है। ऐसे मामले में प्रोग्रामर अज्ञात डेटा प्रकार के स्थान को इंगित करने के लिए एक शून्य पॉइंटर का उपयोग कर सकता है। कार्यक्रम को इस तरह से सेट किया जा सकता है कि उपयोगकर्ता को डेटा के प्रकार की जानकारी देने के लिए कहा जा सके और उपयोगकर्ता द्वारा इनपुट की गई जानकारी के अनुसार टाइपिंग की जा सके। एक कोड स्निपेट नीचे दिया गया है।
void funct(void *a, int z)
{
if(z==1)
printf("%d",*(int*)a); // If user inputs 1, then he means the data is an integer and type casting is done accordingly.
else if(z==2)
printf("%c",*(char*)a); // Typecasting for character pointer.
else if(z==3)
printf("%f",*(float*)a); // Typecasting for float pointer
}
एक और महत्वपूर्ण बिंदु जो आपको शून्य बिंदुओं के बारे में ध्यान में रखना चाहिए, वह है - सूचक अंकगणितीय को शून्य सूचक में नहीं किया जा सकता है।
void *ptr;
int a;
ptr=&a;
ptr++; // This statement is invalid and will result in an error because 'ptr' is a void pointer variable.
तो अब मुझे समझ आ गया था कि मेरी क्या गलती थी। मैं उसी को ठीक कर रहा हूं।
संदर्भ:
http://www.antoarts.com/void-pointers-in-c/
http://www.circuitstoday.com/void-pointers-in-c ।
नया कोड नीचे दिखाया गया है।
#include<stdio.h>
#define INT 1
#define FLOAT 2
void absolute_value ( void *j, int *n)
{
if ( *n == INT) {
if ( *((int*)j) < 0 )
*((int*)j) = *((int*)j) * (-1);
}
if ( *n == FLOAT ) {
if ( *((float*)j) < 0 )
*((float*)j) = *((float*)j) * (-1);
}
}
int main()
{
int i = 0,n=0;
float f = 0;
printf("Press 1 to enter integer or 2 got float then enter the value to get absolute value\n");
scanf("%d",&n);
printf("\n");
if( n == 1) {
scanf("%d",&i);
printf("value entered before absolute function exec = %d \n",i);
absolute_value(&i,&n);
printf("value entered after absolute function exec = %d \n",i);
}
if( n == 2) {
scanf("%f",&f);
printf("value entered before absolute function exec = %f \n",f);
absolute_value(&f,&n);
printf("value entered after absolute function exec = %f \n",f);
}
else
printf("unknown entry try again\n");
return 0;
}
धन्यवाद,