मैं वर्तमान में स्टैनफोर्ड ऑनलाइन, CS106B द्वारा प्रस्तुत इस परिचयात्मक प्रोग्रामिंग पाठ्यक्रम को ले रहा हूं। लिंक्ड लिस्ट स्ट्रक्चर में प्रोफेसर ने इस कोड को लागू किया जिसे मैं अपने सिर के चारों ओर लपेटने में असमर्थ हूं।

 Entry *GetNewEntry(){

    cout << "Enter name (ENTER to quit):";
    string name = GetLine();
    if (name == "") return NULL;
    Entry *newOne = new Entry; // allocate in heap
    newOne->name = name;
    cout << "Enter address: ";
    newOne->address = GetLine();
    cout << "Enter phone: ";
    newOne->phone = GetLine();
    newOne->next = NULL; // no one follows
    return newOne;
}

क्या कोई कृपया मुझे यह समझने में मदद कर सकता है कि फ़ंक्शन नाम से पहले एक डिफरेंस ऑपरेटर क्यों है। अगर हम इसे हटा दें तो क्या बदलेगा? मैंने इसे गूगल करने की कोशिश की है लेकिन मुझे कोई संतोषजनक जवाब नहीं मिला है।

c++
2
Ikaa1991 27 सितंबर 2019, 06:45
1
Entry *GetNewEntry() को Entry* GetNewEntry() के रूप में भी लिखा जा सकता है। क्या यह ज़्यादा सही लगता है?
 – 
user4581301
27 सितंबर 2019, 06:50
यह निश्चित रूप से करता है, अब जब मुझे पता है कि इसका क्या अर्थ है। लेकिन मुझे समझने में मुश्किल हो रही थी, यह ठीक उसी तरह से हैंडआउट्स में लिखा गया था और मैंने बस कॉपी कर ली थी।
 – 
Ikaa1991
27 सितंबर 2019, 06:58
व्हाइटस्पेस पोजिशनिंग आमतौर पर सी और सी ++ में काफी ढीली होती है। "गिबरिश" का वास्तव में क्या अर्थ है, यह जानने में सहायता के लिए यहां एक बढ़िया टूल है: cdecl.org
 – 
user4581301
27 सितंबर 2019, 07:02

2 जवाब

सबसे बढ़िया उत्तर

फ़ंक्शन GetNewEntry का रिटर्न मान Entry * प्रकार का सूचक है।

यदि आपने * को कोड से हटा दिया है, तो आप इसके बजाय एक Entry वापस कर देंगे, और कोड संकलित करने में विफल हो जाएगा, क्योंकि newOne एक Entry * है।

5
jxh 27 सितंबर 2019, 06:48
इसलिए, यहां एंट्री एक स्ट्रक्चर है ... और GetNewEntry एंट्री टाइप का पॉइंटर देता है। क्या वो सही है?
 – 
Ikaa1991
27 सितंबर 2019, 06:54
1
Entry कुछ है। int का उपनाम हो सकता है और परिणाम समान होता है: Entry का सूचक। संपादित करें पूर्ववर्ती पूरी तरह से स्पष्ट नहीं है। इस मामले में एंट्री एक struct या एक class है (C++ में दोनों के बीच ज्यादा अंतर नहीं है)। मैं जिस बिंदु को बनाने की कोशिश कर रहा था, वह कोई मायने नहीं रखता।
 – 
user4581301
27 सितंबर 2019, 06:59

यह एक प्रकार है जिसे 'पॉइंटर टू एंट्री' कहा जाता है। आसान समझ के लिए टाइप नाम के आगे तारांकन लगाने का सुझाव दिया जाता है।

//suggested to put the asterisk next to type name
Entry* GetNewEntry(){...
}

//it's ok to put next to function name too
Entry *GetNewEntry(){...
}

मान लें कि Entry एक संरचना है, तो एक Entry चर का आकार गुणों के आकार का योग होगा। हालांकि, Entry* एक Entry संरचना के लिए एक सूचक है, और यह लगातार 4-बाइट आकार (32 बिट सिस्टम), या 8-बाइट आकार (64 बिट सिस्टम) का होता है, जो भी गुणों की संख्या के अंदर होता है संरचना

संपादित करें: सुझाई गई घोषणा को समझना आसान है लेकिन इस मामले में यह गलत लगता है:

//a is pointer, b is Entry
Entry* a,b;

समाधान प्रत्येक सूचक चर को अपनी लाइन पर घोषित करना है:

//a is pointer, b is pointer
Entry* a;
Entry* b;
1
datdinhquoc 27 सितंबर 2019, 08:57
वह अच्छे प्रारूप पर जोर देना चाहते हैं। एंट्री के बजाय ""GetNewEntry() हमें एंट्री का इस्तेमाल करना चाहिए था"" GetNewEntry()। बाद वाले को समझना आसान है। विस्तार से, वापसी प्रकार एंट्री टाइप करने के लिए एक सूचक है।
 – 
Ikaa1991
27 सितंबर 2019, 07:16
केवल स्पष्ट करने हेतु; मान लीजिए कि हम पॉइंटर अंकगणित करते हैं और b+1 का मान पूछते हैं, तो परिणाम क्या होगा? इस मामले में सूचक प्रविष्टि* b . लें
 – 
Ikaa1991
27 सितंबर 2019, 07:22
प्रकार के नाम के आगे तारक लगाने का नहीं 'सुझाव' है। यह वाक्यात्मक रूप से निम्नलिखित पहचानकर्ता से बंधता है, पूर्ववर्ती प्रकार से नहीं। Entry *a,b; पर विचार करें। यदि इसे Entry* a,b; लिखा जाता तो यह संकेत करता कि b एक सूचक है, और यह नहीं है। ओपी जिस अभ्यास के बारे में पूछ रहा है उसका यही कारण है।
 – 
user207421
27 सितंबर 2019, 07:22
क्या आप विस्तार कर सकते हैं? मैं समझ नहीं पा रहा हूं कि आप क्या मतलब निकालने की कोशिश कर रहे हैं
 – 
Ikaa1991
27 सितंबर 2019, 07:26
Entry *a,b में, a, Entry का सूचक है, लेकिन b एक Entry है
 – 
user207421
27 सितंबर 2019, 07:43