2010-09-26 17 views
20

मैं थोड़ा उलझन में हूं कि पॉइंटर्स कैसे काम करते हैं।सी ++ पासिंग पॉइंटर टू फंक्शन (हाउटो) + सी ++ पॉइंटर मैनिपुलेशन

चलो कहते हैं कि मैं निम्नलिखित समारोह और सूचक है, और ...

संपादित:

... मैं समारोह में एक तर्क के रूप किसी वस्तु के लिए एक सूचक का उपयोग करना चाहते।

यानी .:

void Fun(int Pointer){ 
    int Fun_Ptr = ---Passed Pointer---; 
    //So that Fun_Ptr points to whatever ---Passed Pointer points to 

बीच * सूचक और & सूचक अंकन, मैं बहुत उलझन में हूँ। मुझे पता है कि * सूचक का मतलब है जो कुछ भी इंगित करता है।

क्या मैं घोषणा में शून्य (int * सूचक) डालता हूं। जब मैं फ़ंक्शन का उपयोग करता हूं तो क्या होगा?

आपकी सहायता की सराहना की जाती है।

संपादित करें 2:

ठीक है, अब मैं समझ एक घोषणा में उपयोग कर * चर इसका मतलब है कि एक सूचक पारित हो जाएगा। हालांकि, जब मैं फ़ंक्शन का उपयोग करता हूं तो क्या होगा?

यानी

int main(){ 
    int foo; 
    int *bar; 
    bar = foo; 
    Fun(bar); 
} 

संपादित करें 3: ठीक है, तो मुझे ठीक कर लें मैं गलत हूँ:

ऊपर कोड की परंपराओं के अनुसार:

बार = & foo साधन : मेमोरी

* बार = foo का अर्थ है टी बदलें वह मूल्य है कि बार अंक के बराबर करने के लिए जो कुछ भी foo के बराबर होती है

अगर मैं एक दूसरे सूचक (int * दौलत) तो है,:

बार = दौलत का अर्थ है: दौलत सूचक को बार अंक

बार = * दौलत का अर्थ है: मूल्य के लिए बार अंक कि दौलत अंक के लिए, लेकिन दौलत सूचक ही

* बार के लिए नहीं = * दौलत का अर्थ है: मूल्य मूल्य के लिए करने के लिए है कि बार अंक बदल कि दौलत अंक के

& बार = & ओओफ़ का अर्थ है: मेमोरी एड्रेस को बदलें जो बार पॉइंट्स को मेमोरी एड्रेस के समान ही है जो

क्या मुझे यह अधिकार है?

संपादित करें 4: आपकी सभी मदद के लिए धन्यवाद (मेरी इच्छा है कि मैं 1 से अधिक उत्तर स्वीकार कर सकूं, लेकिन मुझे पहले के साथ जाना होगा। मुझे यकीन नहीं है कि एक समुदाय विकी वास्तव में कैसे काम करता है, लेकिन मैं छोड़ दूंगा संपादन के लिए यह तरीका (यदि आपको पसंद है तो इसे एक रेफरी गाइड में बदलने के लिए स्वतंत्र महसूस करें)।

+0

आपका दूसरा संपादन लगभग सही है, हालांकि – Tomas

+0

"क्या यह सही है?"। नहीं। आप 'बार' को 'foo'' के बराबर * नहीं चाहते हैं, आप इसे * * foo' पर इंगित करना चाहते हैं। यह ऑपरेटर के पते के साथ किया जाता है। 'बार = &foo;'। –

+0

बार = foo, अमान्य है, क्योंकि foo एक int है और एक पॉइंटर बार है। सही कोड "बार = और foo" है क्योंकि एक सूचक के रूप में, बार केवल स्मृति पते को एक int नहीं स्टोर कर सकता है। टिप्पणी के उत्तरों के लिए खेद है। – Tomas

उत्तर

39

वहाँ * उपयोग में अंतर है जब आप एक चर को परिभाषित कर रहे है और आप इसे का उपयोग कर रहे है।

घोषणा में,

int *myVariable; 

एक पूर्णांक डेटा प्रकार के लिए सूचक का मतलब है। लेकिन उपयोग में,

*myVariable = 3; 

साधन सूचक आदर करना और संरचना यह तीन के बराबर की ओर इंगित करता है, बल्कि उसके बाद सूचक स्मृति पते के बराबर 0x 0003.

तो अपने समारोह में बनाने के लिए, आप ऐसा करना चाहते हैं:

void makePointerEqualSomething(int* pInteger) 
{ 
    *pInteger = 7; 
} 

समारोह घोषणा में, * मतलब है कि आप एक सूचक से गुजर रहे हैं, लेकिन इसकी वास्तविक कोड शरीर * में आप क्या सूचक की ओर इंगित करता है तक पहुँच रहे हैं मतलब है।

किसी भी भ्रम आप दूर लहर करने की कोशिश में, मैं संक्षेप में एम्परसेंड में जाता हूँ (&)

& साधन कुछ का पता प्राप्त, कंप्यूटर स्मृति में अपनी सटीक स्थान, इसलिए

int & myVariable; 

एक घोषणा में एक पूर्णांक का पता, या एक सूचक!

हालांकि यह

int someData;  
pInteger = &someData; 

मतलब pInteger सूचक ही (याद रखें, संकेत है कि वे क्या बिंदु पर का सिर्फ स्मृति पते दिए गए हैं) बनाने 'someData' के पते के बराबर - तो अब pInteger कुछ डेटा पर इंगित करेगा , और इसका उपयोग करने के लिए इसका उपयोग किया जा सकता है जब आप इसे अस्वीकार करते हैं:

*pInteger += 9000; 

क्या यह आपको समझ में आता है? क्या आप कुछ और भ्रमित पाते हैं?

@ Edit3:

लगभग सही, तीन कथन

bar = *oof; 

के अलावा इसका मतलब है कि बार सूचक एक पूर्णांक के बराबर है, नहीं क्या बार बिंदुओं पर है, जो अवैध है। एक बार यह एक स्मृति पता आप संशोधित नहीं कर सकते वह कहाँ से आया रिटर्न

&bar = &oof;

एम्परसेंड, एक समारोह की तरह है। बस इस कोड की तरह:

returnThisInt("72") = 86; 

अमान्य है, तो आपका है।

अंत में

,

bar = oof 

इसका मतलब यह नहीं है "दौलत सूचक को बार अंक" का मतलब है कि यह उस पते पर बार अंक कि के लिए दौलत अंक, इसलिए बार अंक जो कुछ भी करने के लिए foo पर इशारा कर रही है - बार नहीं फू को इंगित करता है जो ओओएफ को इंगित करता है।

+0

ठीक है, तो क्या इसका मतलब यह है कि PInteger सूचक कुछडेटा पॉइंटर को इंगित करता है? – Biosci3c

+1

मुझे स्पष्टीकरण देना चाहिए था, कुछ डेटा सूचक नहीं है, यह एक कच्चा int है। मैंने अपना जवाब उचित रूप से संपादित किया है। क्या प्रतीक अब आपको समझ में आता है? – Tomas

+0

ठीक है, मुझे लगता है कि मेरे पास कुछ हद तक नीचे है (पॉइंटर्स हमेशा मुझे भ्रमित करते हैं, और मैं वास्तव में उन्हें समझने के लिए कड़ी मेहनत कर रहा हूं)। मुझे लगता है कि अब मुझे इसकी काफी अच्छी समझ है। – Biosci3c

-1

फ़ंक्शनोइड्स का उपयोग करके समझना आपके लिए आसान हो सकता है जो स्पष्ट रूप से स्वच्छ और उपयोग करने के लिए अधिक शक्तिशाली हैं, यह उत्कृष्ट और अत्यधिक अनुशंसित C++ FAQ lite देखें, विशेष रूप से धारा 33.12 को देखें, लेकिन फिर भी, इसे शुरू से ही पढ़ें उस खंड को समझने और समझने के लिए।

typedef void (*foobar)() fubarfn; 

void Fun(fubarfn& baz){ 
    fubarfn = baz; 
    baz(); 
} 

संपादित करें::

आपके प्रश्न का उत्तर करने के लिए,

  • & संदर्भ पता
  • * क्या संदर्भ पते पर निहित है के मूल्य का मतलब है इसका मतलब है कहा जाता डे संदर्भ

तो संदर्भ का उपयोग करके, नीचे उदाहरण, दिखाता है कि हम एक पैरामीटर में गुजर रहे हैं, और इसे सीधे संशोधित करते हैं।

void FunByRef(int& iPtr){ 
    iPtr = 2; 
} 

int main(void){ 
    // ... 
    int n; 
    FunByRef(n); 
    cout << n << endl; // n will have value of 2 
} 
+0

शायद मुझे स्पष्टीकरण देना चाहिए। मैं किसी फ़ंक्शन में पॉइंटर का उपयोग करने की कोशिश नहीं कर रहा हूं, लेकिन फ़ंक्शन पर कुछ ऑब्जेक्ट (एक int कहें) पर पॉइंटर पास करता हूं, इसलिए फ़ंक्शन इस पर काम कर सकता है। मैं इसे साफ़ करने के लिए अपने प्रश्न को संशोधित करूंगा। – Biosci3c

1
void Fun(int *Pointer) 
{ 
    //if you want to manipulate the content of the pointer: 
    *Pointer=10; 
    //Here we are changing the contents of Pointer to 10 
} 

* पहले सूचक सूचक की (घोषणाओं में छोड़कर!)

& सूचक (या किसी भी चर) से पहले सामग्री का मतलब पता है इसका मतलब

संपादित करें:

यहहोना चाहिए
int someint=15; 
//to call the function 
Fun(&someint); 
//or we can also do 
int *ptr; 
ptr=&someint; 
Fun(ptr); 
+0

यह सी वाक्यविन्यास है जब ओपी स्पष्ट रूप से निर्दिष्ट सी ++ .... – t0mm13b

+0

@ tommieb75: यह क्यों मायने रखता है कि यह वैध सी है? यह सी ++ वाक्यविन्यास भी है, और प्रश्नकर्ता ने "सी ++ निर्दिष्ट नहीं किया है, सी हटाए गए"। जो कुछ भी है। –

3

किसी पूर्णांक पर एक सूचक पास करने के लिए।

किसी पूर्णांक के लिए एक संदर्भ पासिंग इस प्रकार दिखाई देगा ...

void Fun(int& ref) { 
    ref = 10; 
} 

int main() { 
    int test = 5; 
    cout << test << endl; // prints 5 

    Fun(test); 
    cout << test << endl; // prints 10 because Fun modified the value 

    return 1; 
} 
3

आप अपने समारोह में एक सूचक करने वाली पूर्णांक पारित करने के लिए चाहते हैं,

समारोह की घोषणा (यदि आप इसे की जरूरत है):

void Fun(int *ptr); 

समारोह की परिभाषा:

void Fun(int *ptr) { 
    int *other_pointer = ptr; // other_pointer points to the same thing as ptr 
    *other_ptr = 3;   // manipulate the thing they both point to 
} 

फ़ंक्शन का उपयोग:

int main() { 
    int x = 2; 
    printf("%d\n", x); 
    Fun(&x); 
    printf("%d\n", x); 
} 

सामान्य नियम के रूप में नोट करें, Ptr या Pointer नामक चर को कभी भी int टाइप नहीं करना चाहिए, जो आपके कोड में तब है। एक पॉइंटर-टू-इंट टाइप int * है।

अगर मैं एक दूसरे सूचक (int * दौलत), तो है:

बार = दौलत का अर्थ है: दौलत को बार अंक सूचक

इसका मतलब है "के लिए बार बात करने के ओफ पॉइंट्स के लिए एक ही बात "।

बार = * दौलत का अर्थ है: दौलत अंक, लेकिन दौलत सूचक ही

कि कुछ भी मतलब नहीं है कि नहीं है कि मूल्य के लिए बार अंक के लिए, यह अवैध है। bar एक सूचक है *oof एक int है। आप एक दूसरे को असाइन नहीं कर सकते हैं।

* बार = * दौलत का अर्थ है: मूल्य कि बार अंक

है कि दौलत अंक मूल्य में बदल हां।

& बार = & दौलत का अर्थ है: स्मृति पता है कि बार अंक ही स्मृति पते के रूप में है कि दौलत अंक को

नहीं, कि फिर से अमान्य है होना करने के लिए बदल जाते हैं। &barbar चर के लिए एक सूचक है, लेकिन इसे "रावल्यू" या "अस्थायी" कहा जाता है, और इसे असाइन नहीं किया जा सकता है। यह अंकगणितीय गणना के परिणाम की तरह है। आप x + 1 = 5 नहीं लिख सकते हैं।

यह आपको पॉइंटर्स के पते के रूप में सोचने में मदद कर सकता है। bar = oof का अर्थ है "बार बनाना, जो एक पता है, ओओएफ के बराबर है, जो एक पता भी है"। bar = &foo का अर्थ है "बार बनाना, जो एक पता है, foo के पते के बराबर है"। यदि bar = *oof का मतलब कुछ भी था, तो इसका मतलब यह होगा कि "मेक बार, जो एक पता है, *oof के बराबर है, जो एक int है"। आप नहीं कर सकते

फिर, & ऑपरेटर का पता है। इसका मतलब है "ऑपरेंड का पता", इसलिए &foo foo का पता है (यानी, foo को पॉइंटर)। * dereference ऑपरेटर है। इसका मतलब है "ऑपरेंड द्वारा दिए गए पते पर बात"। तो bar = &foo, *barfoo किया गया है।

1
void Fun(int* Pointer) -- would be called as Fun(&somevariable) 

आप मज़ा समारोह यानी

*Pointer = 1; 

यह घोषित अंदर यह अपसंदर्भन द्वारा क्या 'प्वाइंटर' अंक की सामग्री में हेरफेर करने की अनुमति होगी ऊपर के रूप में भी आप भी क्या परे डेटा में हेरफेर करने की अनुमति देता है यह इंगित करें:

int foo[10] = {0}; 
Fun(foo); 

फ़ंक्शन में आप * (सूचक + 1) = 12 की तरह कर सकते हैं; सरणी के दूसरे मान को सेट करना।

void Fun(int& Pointer) -- would be called Fun(somevariable) 

आप पॉइंटर संदर्भों को संशोधित कर सकते हैं, हालांकि इस मामले में आप पॉइंटर संदर्भ से परे कुछ भी नहीं पहुंच सकते हैं।

void Foo(int *x);

इस सुविधा का उपयोग करने के लिए::

12

एक समारोह है कि एक पूर्णांक के लिए सूचक ले जाता है की घोषणा करने के लिए


int x = 4; 
int *x_ptr = &x; 
Foo(x_ptr); 
Foo(&x); 

आप वस्तु की एक अन्य प्रकार के लिए एक सूचक चाहते हैं, यह बहुत है वही:

void Foo(Object *o);

लेकिन, आप संदर्भों का उपयोग करना पसंद कर सकते हैं। वे संकेत से कुछ हद तक कम भ्रामक हैं:


// pass a reference 
void Foo(int &x) 
{ 
    x = 2; 
} 

//pass a pointer 
void Foo_p(int *p) 
{ 
    *x = 9; 
} 

// pass by value 
void Bar(int x) 
{ 
    x = 7; 
} 
int x = 4; 
Foo(x); // x now equals 2. 
Foo_p(&x); // x now equals 9. 
Bar(x); // x still equals 9. 
संदर्भ के साथ

, आप अभी भी (के रूप में आप एक सूचक के साथ होता है) x कि कार्य करने के लिए पारित किया गया था बदलने के लिए मिलता है, लेकिन आप अपसंदर्भन बारे में चिंता करने की जरूरत नहीं है या संचालन का पता।

अन्य लोगों द्वारा अनुशंसित अनुसार, C++FAQLite देखें। यह इसके लिए एक उत्कृष्ट संसाधन है।

संपादित 3 प्रतिक्रिया:

बार = & foo का अर्थ है: स्मृति में फू करने के लिए बार बिंदु बनाने

हां।

* बार = foo बदलें मूल्य के बराबर करने के लिए करने के लिए जो कुछ भी foo के बराबर होती है

मतलब यह है कि बार अंक हां।

अगर मैं एक दूसरे सूचक (int * दौलत), तो है:

बार = दौलत का अर्थ है: दौलत सूचक को बार अंक

बार करने के लिए जो कुछ भी दौलत अंक को इंगित करेंगे। वे दोनों एक ही बात को इंगित करेंगे।

बार = * दौलत का अर्थ है: बार अंक मूल्य है कि दौलत अंक के लिए, लेकिन दौलत सूचक ही

नहीं, आप ऐसा नहीं कर सकते (यह मानते हुए पट्टी के प्रकार int * है) के लिए नहीं आप पॉइंटर पॉइंटर्स बना सकते हैं। (int **), लेकिन उसमें शामिल न हो ... आप एक इंटरेक्टर को एक इंटीरियर असाइन नहीं कर सकते (ठीक है, आप कर सकते हैं, लेकिन यह एक विवरण है जो चर्चा के अनुरूप नहीं है)।

* बार = * दौलत का अर्थ है: मूल्य के लिए दौलत अंक कि

हाँ मूल्य के लिए करने के लिए है कि बार अंक बदल जाते हैं।

& बार = & दौलत का अर्थ है: स्मृति पता है कि बार अंक बदलते हैं, तो ऐसा नहीं कर सकते क्योंकि स्मृति पता दौलत अंक कि के रूप में ही करने के लिए

संख्या होने के लिए ऑपरेटर रिटर्न के पते एक रावल्यू असल में, इसका मतलब है कि आप इसे कुछ असाइन नहीं कर सकते हैं।

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