यहां कुछ उत्तरों पर थोड़ा सा विस्तार करने के लिए ...
सी में, जब किसी सरणी पहचानकर्ता को & या आकार के ऑपरेटर के अलावा किसी संदर्भ में दिखाई देता है, तो पहचानकर्ता का प्रकार पूरी तरह से "टी-एन-एलिमेंट सरणी" से "पॉइंटर टू टी" में परिवर्तित हो जाता है, और इसका मान सरणी में पहले तत्व के पते पर निश्चित रूप से सेट किया गया है (जो सरणी के पते के समान ही है)। यही कारण है कि जब आप किसी फ़ंक्शन के लिए तर्क के रूप में सरणी पहचानकर्ता को पास करते हैं, तो फ़ंक्शन को सरणी के बजाय बेस प्रकार के लिए पॉइंटर प्राप्त होता है। चूंकि आप यह नहीं बता सकते कि पहले तत्व को पॉइंटर को देखकर सरणी कितनी बड़ी है, आपको आकार को एक अलग पैरामीटर के रूप में पास करना होगा।
struct Coordinate { int x; int y; };
void SomeMethod(struct Coordinate *coordinates, size_t numCoordinates)
{
...
coordinates[i].x = ...;
coordinates[i].y = ...;
...
}
int main (void)
{
struct Coordinate coordinates[10];
...
SomeMethod (coordinates, sizeof coordinates/sizeof *coordinates);
...
}
कार्यों के लिए सरणी पास करने के कुछ वैकल्पिक तरीके हैं।
टी की एक सरणी के सूचक के रूप में ऐसी कोई बात नहीं है, के रूप में टी करने के लिए एक सूचक के विपरीत, आप इस तरह के एक सूचक घोषणा करेंगे के रूप में
T (*p)[N];
इस मामले में, पी एक करने के लिए एक सूचक है टी की एन-एलिमेंट सरणी (टी * पी [एन] के विपरीत, जहां पी टी के सूचक का एन-एलिमेंट सरणी है)। तो अगर आप सरणी के सूचक के रूप पहला तत्व के लिए सूचक का विरोध करने दे सकते हैं:
struct Coordinate { int x; int y };
void SomeMethod(struct Coordinate (*coordinates)[10])
{
...
(*coordinates)[i].x = ...;
(*coordinates)[i].y = ...;
...
}
int main(void)
{
struct Coordinate coordinates[10];
...
SomeMethod(&coordinates);
...
}
इस विधि का नुकसान यह है कि सरणी आकार तय हो गई है, टी के एक 10 तत्व सरणी के लिए सूचक के बाद से है
struct Coordinate { int x; int y; };
struct CoordinateWrapper { struct Coordinate coordinates[10]; };
void SomeMethod(struct CoordinateWrapper wrapper)
{
...
wrapper.coordinates[i].x = ...;
wrapper.coordinates[i].y = ...;
...
}
int main(void)
{
struct CoordinateWrapper wrapper;
...
SomeMethod(wrapper);
...
}
इस विधि का लाभ यह है कि आप नहीं कर रहे हैं है: टी
एक तीसरा विधि एक struct में सरणी रैप करने के लिए है की एक 20-तत्व वाली सरणी के लिए सूचक से एक अलग प्रकार का है पॉइंटर्स के साथ चारों ओर mucking। नुकसान यह है कि सरणी का आकार निश्चित है (फिर से, टी का 10-तत्व सरणी टी के 20-तत्व सरणी से एक अलग प्रकार है)।
मेमसेट (सरणी, 0, आकार का सरणी) का उपयोग करें; रीसेट के अंदर() चक्र के बजाय :) – rodi
@rodi: यह एक दिलचस्प बात है, क्योंकि आपने एक बग पेश किया है :) मैंने कोड को 'memset' का उपयोग करने के लिए अद्यतन किया है क्योंकि इसका उपयोग किया जाना चाहिए:' memset (array, 0, आकार * आकार * सरणी) '-' आकार (सरणी) 'इस मामले में एक * सूचक * का आकार है, न कि बिंदु डेटा। –
यह अच्छी प्रैक्टिस ** ** नहीं है ** मॉलोक के रिटर्न वैल्यू को टाइप करें। [यहां] देखें (https: // stackoverflow।कॉम/प्रश्न/605845/डू-आई-कास्ट-द-परिणाम-ऑफ-मॉलोक) – Aka