2010-07-31 24 views
16

void पॉइंटर को देखते हुए, यदि मैं void सूचक बिंदु x बाइट्स आगे बनाना चाहता हूं, तो यह कैसे किया जाएगा? char पॉइंटर को कास्टिंग करने से बेहतर तरीका है?शून्य सूचक अंकगणितीय

+0

मैंने पूछा है एक मैं यहां क्या करने की कोशिश कर रहा हूं इसके व्यापक दायरे के साथ सवाल। मैं जानना चाहता हूं कि ऐसा करने का एक बेहतर तरीका है, शून्य को शून्य * कास्टिंग करने का विचार मुझे एक हैक जैसा लगता है। http://stackoverflow.com/questions/3378090/custom-memory-manager – aCuria

+0

aCuria मैंने भावना साझा की। इसलिए 2 प्रश्न जो पहले से ही इस बारे में मौजूद हैं, मैंने अपने उत्तर में लिंक किया है। –

+0

यदि आपके पास अधिकतर सी प्रोग्राम है जो कुछ सी ++ सुविधाओं का उपयोग करने के लिए होता है, तो संकलक आपके प्रोग्राम में हर शून्य * के बारे में शिकायत करेगा। मेरी राय में, संकलक फिर कुछ गलत कर रहा है, प्रोग्रामर नहीं। तो एक कामकाज आवश्यक है, एक पूर्ण कार्यक्रम नवीनीकरण नहीं। – Minthos

उत्तर

14

को एक चार सूचक कास्टिंग करने से बेहतर तरीका है?

नहीं (एक char * होने एक void * के बजाय, के साथ शुरू करने के लिए, ताकि आप सब पर यह कास्ट करने के लिए की जरूरत नहीं है को छोड़कर)।

यदि यह वांछनीय या संभव नहीं है, तो एक ही रास्ता है:

ptr = static_cast<char *>(ptr) + offset; 

(ध्यान दें:। आप सी ++ में सामान की इस तरह, आमतौर पर वहाँ एक बेहतर समाधान है जब तक कर रहे हैं आप एक विशेषज्ञ हैं और आपने पहले से ही हर दूसरे विकल्प से इंकार कर दिया है, मेरा सुझाव है कि आप एक नया सवाल पूछें कि क्या करने का प्रयास करने का कोई बेहतर तरीका है!)

+0

जैसा कि आपने सुझाव दिया है, मैंने यहां एक और प्रश्न पोस्ट किया है http://stackoverflow.com/questions/3378090/custom-memory-manager – aCuria

2

this question, और this question पर एक नज़र डालें । संक्षेप में, उत्तर को बाइट स्तर पर अंकगणित के लिए char * पर डालना है।

4

एक शून्य सूचक को देखते हुए, यदि मैं आगे शून्य बाइट्स को शून्य पॉइंटर पॉइंट बनाना चाहता हूं, तो यह कैसे किया जाएगा? एक चार सूचक को कास्टिंग करने से बेहतर तरीका है?

यदि आपके पास void* है, तो आप नहीं जानते कि "x बाइट्स आगे" एक मान्य पता है। आप नहीं जानते कि इस तरह के पॉइंटर बनाने से आपके प्रोग्राम को क्रैश नहीं होगा।

और यही कारण है कि यह void* के साथ नहीं किया जा सकता है।

आप केवल एक सरणी में पॉइंटर्स पर पॉइंटर अंकगणित कर सकते हैं। और यदि आपके पास किसी सरणी में पॉइंटर है, तो आप सरणी के प्रकार को जानते हैं, और समकक्ष सूचक प्रकार का उपयोग कर सकते हैं।

आप सार "बाइट सूचक" किसी तरह का चाहते हैं (उदाहरण के लिए, आप एक स्मृति पूल को लागू करने और एक विशिष्ट एक बफर में ऑफसेट करने के लिए बात करने के लिए की जरूरत है कर रहे हैं), तो आप char* या unsigned char*, नहीं void* उपयोग करना चाहिए।

2

पॉइंटर अंकगणितीय कंपाइलर करते समय पॉइंटर को इंगित करने वाले प्रकार के बारे में क्या पता है, यह ध्यान में रखना चाहता है।

उदाहरण के लिए यदि आपके पास int *myint है। तो फिर इन दोनों के बयान वास्तव में एक ही बात करते हैं:

int a = *(myint+5); 

और

int a = myint[5]; 
इस मामले myint+5 में

मतलब यह नहीं है "मींट का पता प्लस 5" लेकिन "मींट का पता प्लस 5 * sizeof (int)) "

तो void * के मामले में संकलक कोई अनुमान नहीं लगा सकता कि void * + 5 का क्या अर्थ होना चाहिए। तो इससे पहले कि आप शून्य का उपयोग करें * यह आपको यह बताने के लिए मजबूर करता है कि आप इसका उपयोग कैसे करना चाहते हैं।

+1

यह सी संकलक की तरह आकार (शून्य) = 1 मान सकता है। लेकिन निश्चित रूप से यह बहुत आसान होगा। – Minthos

-2

इस प्रश्न का उत्तर देने वाले अन्य लोगों के अंतर में, ऐसा लगता है कि एक साधारण +x (बिल्कुल कोई कास्टिंग नहीं) आपके शून्य सूचक से x बाइट्स पते तक पहुंचने के लिए पर्याप्त है। संकलक इसे पसंद नहीं कर सकता है, लेकिन कम से कम मामलों में मैंने इसका उपयोग किया है, यह काम किया है। मैं g++ (gcc) का उपयोग कर रहा हूं ...

तो जब तक आप जानते हैं कि आप क्या कर रहे हैं, कोई जांच नहीं है।

+1

शून्य पॉइंटर्स पर अंकगणित सी ++ में परिभाषित नहीं किया गया है। 'शून्य 'एक अपूर्ण प्रकार है, और पॉइंटर अंकगणितीय केवल पूरी तरह परिभाषित प्रकारों के लिए काम करता है। – Mat

-1

यहाँ मेरी समस्या

void *inputAudioBuffer; 

ग था ++ मुझे एक प्रकार डाली मैं यह कर कर रहा था करने के बाद इस

UInt16 *inputBuffer = (UInt16 *)(inputAudioBuffer + inputBufferOffset); 

कर दे नहीं कर रहा था

UInt16 *inputBuffer = (UInt16 *)((UInt16 *) inputAudioBuffer + inputBufferOffset); 
संबंधित मुद्दे