दिलचस्प पोस्ट
आईडी को निकालें जो एक्स बार आर हो जावास्क्रिप्ट में सो जाओ – कार्रवाई के बीच देरी कैसे फेसबुक, जीमेल वास्तविक समय अधिसूचना भेजता है? घूमते हुए बफ़ड़े छवियाँ कुछ सीपीयू पर तंग छोरों में एडीसी / एसबीबी और आईएनसी / डीईसी के साथ समस्याएं / usr / bin / codeign निकास कोड 1 के साथ विफल Android में कैमरा ओरिएंटेशन समस्या VB.net JSON Deserialize JavaFX2: क्या मैं एक पृष्ठभूमि कार्य / सेवा रोक सकता हूं? एडब्ल्यूएस एसएसएच एक्सेस 'अनुमति अस्वीकृत (प्रकाशक)' मुद्दा Preg_replace_callback के साथ पदावनत preg_replace / e को बदलें मैं टर्मिनल से MySQL के साथ डेटाबेस कैसे आयात कर सकता हूं? बैच फ़ाइल में किसी अन्य प्रक्रिया को निष्पादित करने के लिए प्रक्रिया समाप्त करने के लिए कैसे प्रतीक्षा करें कोणीय CLI एसएएसएस विकल्प क्लास में 'स्टैटिक' कीवर्ड क्या करता है?

सी प्रोग्रामिंग में शून्य सूचक की अवधारणा

क्या सी प्रोग्रामिंग भाषा में टाइप-कास्टिंग के बिना शून्य सूचक को दुबारा करना संभव है?

इसके अलावा, क्या एक समारोह को सामान्य करने का कोई तरीका है जो एक पॉइंटर प्राप्त कर सकता है और इसे शून्य सूचक में रखता है और उस शून्य पॉइंट का उपयोग करके हम एक सामान्यीकृत फ़ंक्शन बना सकते हैं?

उदाहरण के लिए:

void abc(void *a, int b) { if(b==1) printf("%d",*(int*)a); // If integer pointer is received else if(b==2) printf("%c",*(char*)a); // If character pointer is received else if(b==3) printf("%f",*(float*)a); // If float pointer is received } 

मैं if-else स्टेटमेंट्स का उपयोग किए बिना इस फ़ंक्शन जेनेरिक को बनाना चाहता हूं – क्या यह संभव है?

इसके अलावा अगर कोई अच्छा इंटरनेट लेख है जो शून्य पॉइंटर की अवधारणा को समझाता है, तो अगर आप URL प्रदान कर सकते हैं तो यह फायदेमंद होगा।

इसके अलावा, शून्य संकेतक के साथ पॉइंटर अंकगणित संभव है?

वेब के समाधान से एकत्रित समाधान "सी प्रोग्रामिंग में शून्य सूचक की अवधारणा"

सी प्रोग्रामिंग भाषा में टाइप-कास्टिंग के बिना शून्य सूचक को दुबारा करना संभव है …

नहीं, void प्रकार की अनुपस्थिति को इंगित करता है, ऐसा कुछ नहीं है जिसे आप dereference या आवंटित कर सकते हैं

क्या कोई फ़ंक्शन सामान्यीकृत करने का कोई तरीका है जो पॉइंटर को प्राप्त कर सकता है और इसे शून्य सूचक में संग्रहीत करता है और उस शून्य पॉइंटर का उपयोग करके हम एक सामान्यीकृत फ़ंक्शन बना सकते हैं ..

आप इसे किसी पोर्टेबल तरीके से केवल dereference नहीं कर सकते, क्योंकि यह ठीक तरह से गठबंधन नहीं हो सकता है। यह कुछ आर्किटेक्चर जैसे कि एआरएम पर एक मुद्दा हो सकता है, जहां डेटा प्रकार के पॉइंटर को डेटा प्रकार के आकार की सीमा पर गठबंधन किया जाना चाहिए (जैसे पॉइंटर को 32-बिट पूर्णांक को 4-बाइट सीमा पर गठबंधन किया जाना चाहिए, जिसे डीरेंस करना है)।

उदाहरण के लिए, uint16_t को void* से पढ़ना void* :

 /* may receive wrong value if ptr is not 2-byte aligned */ uint16_t value = *(uint16_t*)ptr; /* portable way of reading a little-endian value */ uint16_t value = *(uint8_t*)ptr | ((*((uint8_t*)ptr+1))<<8); 

साथ ही, शून्य संकेतक के साथ संकेतक गणित संभव है …

पॉइंटर के नीचे ठोस मूल्य की कमी के कारण और इसलिए आकार के कारण पॉइंटर अंकगणित void के संकेत पर संभव नहीं है।

 void* p = ... void *p2 = p + 1; /* what exactly is the size of void?? */ 

सी में, एक void * को एक स्पष्ट कलाकार के बिना एक अलग प्रकार के ऑब्जेक्ट के लिए एक सूचक में परिवर्तित किया जा सकता है:

 void abc(void *a, int b) { int *test = a; /* ... */ 

यह आपके फ़ंक्शन को अधिक सामान्य तरीके से लिखने में मदद नहीं करता, हालांकि।

आप इसे एक अलग पॉइंटर प्रकार के रूप में परिवर्तित करने के लिए एक void * नहीं कर सकते क्योंकि पॉइंटर को ड्यूरेन्फर करने के लिए पॉइंट-टू ऑब्जेक्ट का मान प्राप्त हो रहा है। एक नग्न void एक वैध प्रकार नहीं है, इसलिए void * को कम करना void * संभव नहीं है

पॉइंटर अंकगणित पॉइंटर वैल्यू को इंगित-टू ऑब्जेक्ट के sizeof के गुणकों द्वारा बदलता है। दोबारा, क्योंकि void एक सही प्रकार नहीं है, sizeof(void) का कोई मतलब नहीं है, इसलिए सूचक अंकगण void * पर मान्य नहीं है void * । (कुछ कार्यान्वयन इसे char * लिए समकक्ष अंकक अंकगणितीय का उपयोग करके अनुमति देता है।)

आपको पता होना चाहिए कि सी में, जावा या सी # के विपरीत, कोई वस्तु सफलतापूर्वक "अनुमान" करने की कोई संभावना नहीं है, जिस पर ऑब्जेक्ट शून्य * पॉइंटर बिन्दुओं पर है। "Getclass ()" के समान कुछ ही मौजूद नहीं है, क्योंकि यह जानकारी कहीं नहीं मिलती है। इस कारण के लिए, "सामान्य" प्रकार की आप हमेशा स्पष्ट रूप से मेटाइनाइफेशन के साथ आते हैं, जैसे आपके उदाहरण में "इंट बी" या फ़ंक्शन के प्रिंटफ़ परिवार में प्रारूप स्ट्रिंग।

एक शून्य सूचक को जेनेरिक पॉइंटर कहा जाता है, जो कि किसी भी डेटा प्रकार के चर को संदर्भित कर सकता है।

अब तक शून्य पॉइंटर पर मेरी समझ इस प्रकार है।

जब कीवर्ड पॉइंटर वैरिएबल को कीवर्ड वायड के जरिए घोषित किया जाता है – यह सामान्य प्रयोजन पॉइंटर वैरिएबल बन जाता है। किसी भी डेटा प्रकार के किसी भी चर का पता (char, int, float आदि) को रिक्त पॉइंटर वैरिएबल को निर्दिष्ट किया जा सकता है।

 main() { int *p; void *vp; vp=p; } 

चूंकि अन्य डेटा टाइप पॉइंटर शून्य पॉइंटर को सौंपा जा सकता है, इसलिए मैंने इसे absolut_value (नीचे दिखाया गया कोड) फ़ंक्शन में उपयोग किया। सामान्य कार्य करने के लिए

मैंने एक साधारण सी कोड लिखने की कोशिश की जो एक तर्क के रूप में पूर्णांक या फ्लोट को लेता है और इसे बनाने की कोशिश करता है + अगर, ऋणात्मक। मैंने निम्नलिखित कोड लिखा था,

 #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; } 

धन्यवाद,

ग में एक शून्य सूचक को सामान्य पॉइंटर के रूप में जाना जाता है। जेनेरिक पॉइंटर का शाब्दिक अर्थ एक सूचक है जो किसी भी प्रकार के डेटा को इंगित कर सकता है

void *ptr;

  1. हम सामान्य पॉइंटर को किसी भी अन्य पॉइंटर पर डिफरेंस नहीं कर सकते।

  2. हम sizeof ऑपरेटर का उपयोग करते हुए जेनेरिक पॉइंटर का आकार पा सकते हैं।

  3. जेनेरिक पॉइंटर किसी भी प्रकार के पॉइंटर्स जैसे कि चार पॉइंटर, स्ट्रक्चर पॉइंटर, पॉइंटर इत्यादि को बिना किसी टाइपकास्टिंग के रख सकते हैं।

  4. किसी भी प्रकार का संकेतक बिना किसी टाइपकास्टिंग के सामान्य जेनरेटर रख सकता है।

  5. जेनेरिक पॉइंटर्स का उपयोग किया जाता है जब हम ऐसे पॉइंटर को वापस करना चाहते हैं जो सभी प्रकार के पॉइंटर्स पर लागू होता है। उदाहरण के लिए, malloc फ़ंक्शन का रिटर्न टाइप जेनेरिक पॉइंटर है क्योंकि यह डायनामिक रूप से पूर्णांक, फ्लोट, स्ट्रक्चर आदि को स्टोर करने के लिए मेमोरी स्पेस को आवंटित कर सकता है। इसलिए हम अपने रिटर्न प्रकार को उपयुक्त पॉइंटर टाइप टाइप करते हैं।

 void abc(void *a, int b) { char *format[] = {"%d", "%c", "%f"}; printf(format[b-1], a); } 

नहीं, यह संभव नहीं है। क्या dereferenced मूल्य होना चाहिए?

Is का उपयोग किए बिना, मैं इस फ़ंक्शन को सामान्य बनाना चाहता हूं; क्या यह संभव है?

एकमात्र सरल तरीका मैं देख रहा हूं ओवरलोडिंग का उपयोग करना है .. जो सी प्रोग्रामिंग लैंगेज AFAIK में उपलब्ध नहीं है।

क्या आप अपने प्रोग्राम के लिए सी ++ प्रोग्रामिंग लैंगेज पर विचार करते हैं? या क्या कोई बाधा है जो इसका इस्तेमाल मना करता है?

आप आसानी से एक शून्य प्रिंटर मुद्रित कर सकते हैं

 int p=15; void *q; q=&p; printf("%d",*((int*)q)); 

क्योंकि सी स्थिर रूप से टाइप किया गया है, जोर से टाइप की गई भाषा, आपको संकलन से पहले चर का प्रकार तय करना होगा। जब आप सी में जेनेरिक्स का अनुकरण करने की कोशिश करते हैं, तो आप C ++ को दोबारा लिखने का प्रयास समाप्त कर देंगे, इसलिए इसके बजाय C ++ का उपयोग करना बेहतर होगा।

यह काम नहीं करेगा, फिर भी शून्य * कार्यों में जेनेरिक पॉइंटर को परिभाषित करने में बहुत मदद कर सकता है और इसे किसी अन्य फ़ंक्शन (जावा में कॉलबैक के समान) के तर्क के रूप में पारित कर सकता है या इसे ओओपी के समान संरचना परिभाषित कर सकता है।