सबसे सही तरीका में के रूप में एक अस्थायी चर का उपयोग कर रहा है:
void *tmp_pointer;
....
tmp_pointer = array[1];
array[1] = array[4];
array[4] = tmp_pointer;
....
किसी भी बुराई बिट से दूर रहना या हैक्स int! :)
आप सुरक्षित रूप से डेटा और संकेत दिए गए कार्य करने के लिए की ओर इशारा नहीं मिश्रण कर सकते हैं मुझे यहाँ जोड़ने है कि हम के लिए कहा जाना चाहिए था करने दें "सूचक की किस प्रकार?"
सिद्धांत रूप में,। सी मानक गारंटी नहीं देता है कि यह अर्थपूर्ण या संभव होगा। यह केवल सुनिश्चित करता है कि:
- डेटा संकेत वापस परिवर्तित किया जा सकता है और
void *
से
- ((शून्य *) 0) एक सूचक है कि किसी भी डेटा सूचक या समारोह सूचक एक की
- समारोह संकेत से अलग है प्रकार को किसी अन्य प्रकार और पीछे के फ़ंक्शन पॉइंटर्स में परिवर्तित किया जा सकता है।
मैं समझता हूं कि ऐसा इसलिए है क्योंकि कुछ आर्किटेक्चर में, डेटा के लिए पता स्थान पूरी तरह से फ़ंक्शंस के लिए पता स्थान से अलग हो गया है और आप सुरक्षित रूप से पॉइंटर्स के प्रकार से दूसरे और पीछे से परिवर्तित नहीं कर सकते हैं।
स्रोत
2010-01-19 14:08:34
अब जब मैं आपके अन्य प्रश्नों को सरणी पर देखता हूं, तो मुझे यह पूछने की ज़रूरत है: क्या वे फ़ंक्शन पॉइंटर्स हैं? यदि वे हैं, तो 'शून्य *' का उपयोग करने वाले समाधान काम करने की गारंटी नहीं देते हैं। –
मैं एक int सरणी पर स्वैप कर रहा हूं जो इस तरह के पॉइंटर्स रखता है: myPointerArray [0] सरणी [0] को इंगित करता है, myPointerArray [1] सरणी [1] को इंगित करता है और इसी तरह। क्या इससे समस्याएं पैदा हो सकती हैं? – Pieter
एकमात्र समस्या यह है कि यदि आप पॉइंटर्स को डेटा और पॉइंटर्स को फ़ंक्शंस में मिलाते हैं। कुछ आर्किटेक्चर डेटा और फ़ंक्शंस पर एड्रेसिंग स्पेस को अलग करना होता है और आप चीजें नहीं कर सकते: 'int f(); शून्य * पी; ... पी = एफ; '। यदि मुझे लगता है कि आपको क्या कहना है तो आपको ठीक होना चाहिए, लेकिन आप निश्चित रूप से सुनिश्चित करने के लिए कुछ और कोड पोस्ट कर सकते हैं। –