2011-03-23 16 views
5

t पर मान निर्दिष्ट करने से पहले, निम्नलिखित कोड में t प्रारंभ करना अनिवार्य है? क्या कोड सही है?क्या सी ++ में पॉइंटर्स प्रारंभ करना अनिवार्य है?

void swap(int *x, int *y) 
{ 
    int *t; 
    *t = *x; 
    *x = *y; 
    *y = *t; 
} 
+0

आपको संभवतः अपने प्रश्न को थोड़ा सा हल करना चाहिए। नीचे कुछ विरोधाभासी जवाब हैं, हालांकि सभी सही हैं। _Assigning_ एक अनियमित पॉइंटर का मान पूरी तरह वैध है, _dereferencing_ यह नहीं है। आपका कोड स्निपेट dereferences, लेकिन आपका सवाल असाइनमेंट के बारे में है। – Damon

+0

साइड टिप्पणी, एक मानक परिभाषित 'स्वैप' फ़ंक्शन (अच्छी तरह से, टेम्पलेट) है, लेकिन इसमें आप जो भी कर रहे हैं उससे भिन्न अर्थशास्त्र है। क्या आप वाकई अर्थशास्त्र को बदलकर उपयोगकर्ताओं को भ्रमित करना चाहते हैं? (आपके कार्यान्वयन के साथ: 'स्वैप (पी, क्यू) '' std :: swap (* p, * q) 'के बराबर है, लेकिन' std :: swap (p, q) नहीं है, बाद वाला पॉइंटर्स को स्वैप करेगा, बल्कि सामग्री से) –

+0

मुझे पता है कि हम एक्स द्वारा इंगित मूल्य को संग्रहीत करने के लिए एक साधारण चर का उपयोग कर सकते हैं, और फिर स्वैपिंग किया जाता है। लेकिन मैं सिर्फ प्रयोग कर रहा हूं कि क्या हम मूल्य को स्टोर करने के लिए सरल चर के बजाय एक सूचक का उपयोग कर सकते हैं। – Baali

उत्तर

9

आप के साथ शुरू करने के लिए सूचक की जरूरत नहीं है:

void swap(int *x,int *y) 
{ 
    int t; //not a pointer! 
    t=*x; 
    *x=*y; 
    *y=t; 
} 
int a = 10, b = 20; 
swap(&a, &b); //<-----------note : Needed & 

-

या हो सकता है, तो आपको निम्न स्वैप समारोह चाहते हैं:

void swap(int & x,int & y) //parameters are references now! 
{ 
    int t; //not a pointer! 
    t=x; 
    x=y; 
    y=t; 
} 
int a = 10, b = 20; 
swap(a,b); //<----------- Note: Not needed & anymore! 
+1

उनका प्रश्न "दो चर के मूल्यों को स्वैप कैसे करें?" नहीं है। –

+0

@ प्र्रासून: मुझे यह पता है। लेकिन मैं उसे उन विकल्पों को बता रहा हूं जिनके पास उनके पास प्रयोग है और प्रयोग कर सकते हैं, क्योंकि अन्य उत्तरों ने पहले से ही अपने मामले को समझाया है! – Nawaz

8

कोड की निम्न अनुभाग सही है?

नोप्स! आपका कोड अपरिभाषित व्यवहार का आह्वान करता है क्योंकि आप जंगली सूचक को अपमानित करने का प्रयास कर रहे हैं।

int *t; 
*t=*x; // bad 

इस प्रयास करें बल्कि

int t; // a pointer is not needed here 
t=*x; 

या इस

int *t = x; // initialize the pointer 

5

कि कोड अपरिभाषित व्यवहार शामिल हैं:

int *t; 
*t=*x; // where will the value be copied? 

इसके अलावा यह कोई समझ नहीं आता है - आपको मूल्य को स्टोर करने के लिए अस्थायी चर की आवश्यकता है, पॉइंटर नहीं।

int t; // not a pointer 
t=*x; 
*x=*y; 
*y=t; 
1

यह के लिए सही है एक सूचक

घोषणाओं पर केवल संदर्भों को प्रारंभ करने की आवश्यकता है (या उदाहरण के सदस्यों के लिए एक निर्माता में)।

संपादित करें: लेकिन आप मिल गया अपने कोड में त्रुटियों, तो आप अपने मानकों को अपसंदर्भन नहीं किया जाना चाहिए (यानी int *ptr = otherPtr;, ठीक है नहीं int *ptr = *otherPtr;)

+0

एक प्रारंभिक सूचक का अपरिवर्तनीय अपरिभाषित व्यवहार है। –

+0

मैं केवल ओपी के प्रश्न का उत्तर दे रहा था, कोड के पूरे ब्लॉक की जांच नहीं कर रहा था। सवाल यह था कि असाइनमेंट के बिना पॉइंटर घोषित करना वैध है, जो यह है। – jv42

+0

@ jv42: आप एक सूचक _with_ असाइनमेंट घोषित नहीं कर सकते हैं। –

0
int *t; 
*t=*x; 

t किसी वैध स्थान की ओर इशारा करते नहीं है करने में सक्षम हो भिन्नता।

पॉइंटर टी को मान निर्दिष्ट करने से पहले प्रारंभ करना अनिवार्य है।

हां, वैध स्मृति स्थान को इंगित करने के लिए प्रारंभ/असाइन करना। अन्यथा यह कहां इंगित करेगा। यह कुछ कचरे को इंगित कर सकता है और पर पर पर ले जा सकता है।

1

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

उचित, कारगर तरीका, सी में अदला-बदली करने के लिए/C++

void swap(int *x, int *y) { 
    int *t = x; 
    x = y; 
    y = t; 
} 
+0

इस तरह मैं इसे भी करूंगा। मैं कभी भी पॉइंटर को अनियमित नहीं छोड़ने की कोशिश करता हूं, और यदि मेरे पास पहले से एक और पॉइंटर है जिसे मैं इसे असाइन करना चाहता हूं, तो मैं वैसे भी उस मान को आरंभ करता हूं। – Mephane

1

आप इस here

#include <stdio.h> 

void swap(int *i, int *j) 
{ 
    int t; 
    t = *i; 
    *i = *j; 
    *j = t; 
} 

असल कारण ऐसा करने का सही तरीके से मिल सकती है आप के लिए समझाया गया है sharptooth द्वारा, लेकिन जब आप इस तरह के स्वैप करते हैं तो पृष्ठभूमि में क्या होता है इसके बारे में आपको कुछ और विवरण और स्पष्टीकरण मिलेगा। उम्मीद है कि यह आपके विचारों को साफ़ करने में मदद करता है।

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