आप C89/90 में सरणी घोषणा के आकार भाग में टाइप क्वालीफायर या static
का उपयोग नहीं कर सकते हैं। ये विशेषताएं सी 99 के लिए विशिष्ट हैं।
static
सरणी घोषणा में संकलक बताता है कि आप का वादा करते हैं कि तत्वों की निर्दिष्ट संख्या हमेशा वास्तविक तर्क के रूप में पारित सरणी में मौजूद होगी। यह कंपाइलर्स को अधिक कुशल कोड उत्पन्न करने में मदद कर सकता है। यदि आप वास्तविक कोड में अपने वादे का उल्लंघन करते हैं (यानी एक छोटी सरणी पास करते हैं), व्यवहार अपरिभाषित है। उदाहरण के लिए,
void foo(int a[static 3]) {
...
}
int main() {
int a[4], b[2];
foo(a); /* OK */
foo(b); /* Undefined behavior */
}
*
सरणी घोषणा के आकार हिस्से में समारोह प्रोटोटाइप घोषणाओं में ही प्रयोग किया जाता है।यह इंगित करता है कि सरणी में परिवर्तनीय लंबाई (वीएलए) है। उदाहरण के लिए, समारोह परिभाषा आप एक ठोस रन-टाइम आकार
void foo(int n, int a[n]) /* `a` is VLA because `n` is not a constant */
{
...
}
के साथ एक VLA उपयोग कर सकते हैं जब आप प्रोटोटाइप की घोषणा आप कर सकते हैं एक ही
void foo(int n, int a[n]); /* `a` is VLA because `n` is not a constant */
लेकिन यदि आप निर्दिष्ट नहीं करते पैरामीटर नाम (जो प्रोटोटाइप में ठीक है), आप पाठ्यक्रम के सरणी आकार के रूप में n
का उपयोग नहीं कर सकते हैं। फिर भी, अगर आप अभी भी संकलक कि सरणी एक VLA होने जा रहा है यह बताने के लिए है, तो आप *
उस उद्देश्य
void foo(int, int a[*]); /* `a` is VLA because size is `*` */
नोट के लिए उपयोग कर सकते हैं, कि एक 1 डी सरणी के साथ उदाहरण के लिए एक अच्छा एक नहीं है। यहां तक कि अगर आप *
छोड़ देते हैं और
void foo(int, int a[]);
के रूप में ऊपर समारोह की घोषणा तो कोड को अभी भी है क्योंकि समारोह पैरामीटर घोषणाओं सरणी प्रकार में कार्य करेंगे, परोक्ष वैसे भी सूचक प्रकार के साथ बदल दिया है। लेकिन एक बार जब आप बहु-आयामी सरणी का उपयोग शुरू करते हैं, तो *
का उचित उपयोग महत्वपूर्ण हो जाता है। उदाहरण के लिए, समारोह
void bar(int n, int m[n][n]) { /* 2D VLA */
...
}
के रूप में परिभाषित किया गया है अगर प्रोटोटाइप के रूप में लग सकता है
void bar(int n, int m[n][n]); /* 2D VLA */
या
void bar(int, int m[*][*]); /* 2d VLA */
उत्तरार्द्ध मामले पहले *
में के रूप में छोड़ा जा सकता है इस प्रकार है (सरणी-से-पॉइंटर प्रतिस्थापन के कारण), लेकिन दूसरा *
नहीं।
मुझे लगता है कि यह जगह वास्तव में मायने रखती है जब आप 'f (int, int, int a [*] [*]) 'या जैसे ... – dmckee
@dmckee: मैं बस इसे अपने उत्तर में जोड़ रहा था :) – AnT
बहुत सारे लोग यहां के आसपास की लाइनों के साथ सोचते हैं। महान दिमाग और वह सब ... – dmckee