2010-01-19 9 views
5

मेरे पास एक सरणी है जिसमें पॉइंटर्स हैं। मैं दो पॉइंटर्स कैसे स्वैप कर सकता हूं - सरणी [1] और सरणी [4] कहें - सही ढंग से?सी: एक सरणी में swapping पॉइंटर्स

void*temp = array[4]; 
array[4]=array[1]; 
array[1] = temp; 

संपादित फिक्स्ड प्रथम पंक्ति:

+0

अब जब मैं आपके अन्य प्रश्नों को सरणी पर देखता हूं, तो मुझे यह पूछने की ज़रूरत है: क्या वे फ़ंक्शन पॉइंटर्स हैं? यदि वे हैं, तो 'शून्य *' का उपयोग करने वाले समाधान काम करने की गारंटी नहीं देते हैं। –

+0

मैं एक int सरणी पर स्वैप कर रहा हूं जो इस तरह के पॉइंटर्स रखता है: myPointerArray [0] सरणी [0] को इंगित करता है, myPointerArray [1] सरणी [1] को इंगित करता है और इसी तरह। क्या इससे समस्याएं पैदा हो सकती हैं? – Pieter

+0

एकमात्र समस्या यह है कि यदि आप पॉइंटर्स को डेटा और पॉइंटर्स को फ़ंक्शंस में मिलाते हैं। कुछ आर्किटेक्चर डेटा और फ़ंक्शंस पर एड्रेसिंग स्पेस को अलग करना होता है और आप चीजें नहीं कर सकते: 'int f(); शून्य * पी; ... पी = एफ; '। यदि मुझे लगता है कि आपको क्या कहना है तो आपको ठीक होना चाहिए, लेकिन आप निश्चित रूप से सुनिश्चित करने के लिए कुछ और कोड पोस्ट कर सकते हैं। –

उत्तर

5

कि आपको अस्थायी चर की जरूरत है।

+1

टाइप 'शून्य' क्यों है? – Pieter

+0

लाइन 1 सरणी होना चाहिए [4], नहीं? – ezod

+0

आपका कोड गलत है, बस सरणी अनुक्रमणिका का एक भ्रम है। यह सरणी [1] को अस्थायी रूप से कॉपी कर रहा है, फिर ओवरराइटिंग सरणी [4] और सरणी को वापस सरणी में डालने [1]। – Tony

5
void* temp = array[1]; 
array[1] = array[4]; 
array[4] = temp; 
0

मेरे सी काफी जंग लगी है, लेकिन एक साधारण

पूर्णांक * foo = सरणी [4]; सरणी [4] = सरणी [1]; सरणी [1] = foo;

पर्याप्त होना चाहिए।

3

सबसे सही तरीका में के रूप में एक अस्थायी चर का उपयोग कर रहा है:

void *tmp_pointer; 

.... 
tmp_pointer = array[1]; 
array[1] = array[4]; 
array[4] = tmp_pointer; 
.... 

किसी भी बुराई बिट से दूर रहना या हैक्स int! :)

आप सुरक्षित रूप से डेटा और संकेत दिए गए कार्य करने के लिए की ओर इशारा नहीं मिश्रण कर सकते हैं मुझे यहाँ जोड़ने है कि हम के लिए कहा जाना चाहिए था करने दें "सूचक की किस प्रकार?"

सिद्धांत रूप में,। सी मानक गारंटी नहीं देता है कि यह अर्थपूर्ण या संभव होगा। यह केवल सुनिश्चित करता है कि:

  • डेटा संकेत वापस परिवर्तित किया जा सकता है और void * से
  • ((शून्य *) 0) एक सूचक है कि किसी भी डेटा सूचक या समारोह सूचक एक की
  • समारोह संकेत से अलग है प्रकार को किसी अन्य प्रकार और पीछे के फ़ंक्शन पॉइंटर्स में परिवर्तित किया जा सकता है।

मैं समझता हूं कि ऐसा इसलिए है क्योंकि कुछ आर्किटेक्चर में, डेटा के लिए पता स्थान पूरी तरह से फ़ंक्शंस के लिए पता स्थान से अलग हो गया है और आप सुरक्षित रूप से पॉइंटर्स के प्रकार से दूसरे और पीछे से परिवर्तित नहीं कर सकते हैं।

+0

ओह, लेकिन इसका मतलब है कि कोई xor-swap ...: पी – JPvdMerwe

+0

मैंने कल्पना की कि कोई सुझाव देगा। अगर वे पहले से नहीं थे, तो कोई होगा! यह बहुत बुरा है :) –

1
#include <stdint.h> 
if (1 != 4) { 
    array[1] = (void*)((intptr_t)(array[1])^(intptr_t)(array[4])); 
    array[4] = (void*)((intptr_t)(array[1])^(intptr_t)(array[4])); 
    array[1] = (void*)((intptr_t)(array[1])^(intptr_t)(array[4])); 
} 

बहुत स्पष्ट है और अस्थायी बचाता है। ;-)

+2

यद्यपि आपको उस 1 को जांचने की ज़रूरत है! = 4 या फिर आप एक पॉइंटर को हटाकर स्मृति को रिसाव करते हैं। – JPvdMerwe

+0

@ जेपी: बिलकुल सही। –

+1

आपको "बहुत स्पष्ट" के लिए -1 देने के लिए प्रेरित है जो स्पष्ट रूप से गलत है। लेकिन जवाब काम करता है इसलिए मैं downvoting से बचना होगा। :-) –

संबंधित मुद्दे