एक कार्य के लिए एक संरचना पारित नहीं करता है
नीचे दिए गए कोड में मैंने मुख्य से अलग एक फ़ंक्शन बनाया है जो किसी संरचना के अंदर इंट को आधे में विभाजित करता है।
उसके बाद, मैं नया मूल्य प्रिंट करना चाहता हूं। हालाँकि, प्रिंट आउट मान अभी भी पुराना है।
मेरा मानना है कि संरचना और संकेत के बारे में मेरा मौलिक ज्ञान काफी अच्छा नहीं है।
क्या कोई मुझे इस बारे में सहायता कर सकता है? बहुत बहुत धन्यवाद!!!
typedef struct{
int age;
int wage;
}person;
void divide(person A)
{
person half;
half.age = A.age / 2;
half.wage = A.wage / 2;
A = half;
}
int main(void)
{
person A;
A.age = 30;
A.wage = 35000;
divide(A);
printf("%i\n", A.age);
}
जवाब
फ़ंक्शन divide
उस संरचना की एक प्रति को संशोधित कर रहा है क्योंकि संरचनाएं मूल्य से गुजरती हैं। आपको सूचक को संरचना में पास करने की आवश्यकता होगी, इसलिए फ़ंक्शन मूल को संशोधित कर सकता है।
void divide(person* A)
{
person half;
half.age = A->age / 2;
half.wage = A->wage / 2;
*A = half;
}
divide
मूल संरचना के पते के साथ कहा जाता है
divide(&A);
जब आप पास A
होते हैं divide
, की एक प्रति A
बनाई जाती है। इस प्रति को संशोधित करने से आपके द्वारा परिभाषित divide
स्थानीय चर पर कोई प्रभाव नहीं पड़ता A
है main
। इसे ठीक करने के लिए, आप कर सकते हैं divide
एक ले सूचक को person
। एक पॉइंटर प्रभावी रूप से मेमोरी में एक एड्रेस का प्रतिनिधित्व करता है, जैसे कि आप इसका उपयोग अन्य कार्यों में परिभाषित स्थानीय चर तक पहुंच के लिए कर सकते हैं, जो अन्यथा सुलभ नहीं होगा ( यदि आप यह समझना चाहते हैं कि स्टैक फ्रेम क्यों है)।
तो व्यवहार में आप के divide
हस्ताक्षर को बदल सकते हैं : void divide(person *A)
और इस फ़ंक्शन की अंतिम पंक्ति में, A
लेकिन आप जो कुछ भी करने के लिए नहीं कह रहे हैं , A
वह डीपरेशन ऑपरेटर का उपयोग करके इंगित कर रहा है *A = half
:। अपने main
फ़ंक्शन में आप तब ऑपरेटर के पते का उपयोग करने के बजाय स्वयं के पते को पास करते हैं :।A
A
divide
divide(&A)
संपादित करें: और भी बेहतर, आप half
सीधे प्रदर्शन करके अस्थायी बनाने से बच सकते हैं : A->age /= 2
और A->wage /= 2
कहाँ के A.x
लिए वाक्य रचना चीनी है (*A).x
।