मान लीजिए मैं संकेत की एक सरणी सी में चार करने के लिए है:सी में char के लिए पॉइंटर्स की एक सरणी qsort कैसे?
char *data[5] = { "boda", "cydo", "washington", "dc", "obama" };
और मैं qsort का उपयोग कर इस सरणी क्रमित करना चाहते हैं:
qsort(data, 5, sizeof(char *), compare_function);
मैं तुलना समारोह के साथ आने में असमर्थ हूँ। किसी कारण से यह काम नहीं करता है:
int compare_function(const void *name1, const void *name2)
{
const char *name1_ = (const char *)name1;
const char *name2_ = (const char *)name2;
return strcmp(name1_, name2_);
}
मैं खोज के एक बहुत कुछ किया और पाया कि मैं qsort के अंदर **
का इस्तेमाल किया था:
int compare_function(const void *name1, const void *name2)
{
const char *name1_ = *(const char **)name1;
const char *name2_ = *(const char **)name2;
return strcmp(name1_, name2_);
}
और यह काम करता है।
क्या कोई इस समारोह में *(const char **)name1
के उपयोग की व्याख्या कर सकता है? मैं इसे बिल्कुल समझ में नहीं आता। डबल पॉइंटर क्यों? मेरा मूल कार्य क्यों नहीं हुआ?
धन्यवाद, बोडा साइडो।
के संदर्भ में होगा 'डेटा'' const' घोषित किया जाना चाहिए। –
बिली, अगर यह स्थिर है, तो क्या इसे अभी भी हल किया जा सकता है? – bodacydo
हां। सरणी गैर 'const' हो सकती है, लेकिन उस सरणी के भीतर निहित पॉइंटर्स' const' होना चाहिए। आपको संकलन-समय निरंतर अक्षरों को संशोधित करने की अनुमति नहीं है (ऐसा करने के लिए यह अनिर्धारित व्यवहार है)। इसे पाने के लिए, आप 'const char * डेटा [5]' चाहते हैं। यदि आप सरणी को भी स्थिर रखना चाहते हैं, तो आप 'const char * const data [5]' करेंगे। –