यदि आपको स्मृति होने की आवश्यकता है, तो आपके पास कुछ जोड़े हैं विकल्प।
आप गतिशील स्मृति के एक विशाल खंड आवंटित कर सकता है, और फिर मैन्युअल रूप से अपने ऑफसेट की गणना, इसलिए जैसे:
int **arrp = malloc(sizeof *arrp * rows);
...
for (i = 0; i < rows; i++)
arrp[i] = &arr[i * rows];
...
arrp[i][j] = ...;
:
size_t rows, cols;
...
int *arr = malloc(sizeof *arr * rows * cols);
...
arr[i * rows + j] = ...; // logically equivalent to arr[i][j]
आप मुख्य सरणी में संकेत की एक दूसरी सरणी सेट कर सकते हैं
याद रखना कि आपको arr
और arrp
दोनों को खाली करना होगा।
आप एक C99 कार्यान्वयन है, तो आप बस एक सूचक एक VLA करने के लिए सेट कर सकते हैं, तो जैसे:
int (*arrp)[cols] = (int (*)[cols]) arr;
...
arrp[i][j] = ...;
ध्यान दें कि इस मामले में, आप एक उच्च माध्यमिक सरणी के लिए किसी भी स्मृति का आवंटन नहीं कर रहे हैं, न ही आपको मुख्य सरणी में पॉइंटर्स की मैन्युअल रूप से गणना करने की आवश्यकता है; आपको बस के समान स्थान पर arrp
सेट करना है और पॉइंटर अंकगणित के नियमों को सभी काम करने दें।
छवियों कि बड़ा नहीं हैं, तो आप बस एक VLA (फिर से, C99 या बाद में) सेट कर सकते हैं:
int arr[rows][cols];
लेकिन व्यवहार में यह एक अच्छा विचार नहीं है, ढेर फ्रेम आमतौर पर आकार में काफी सीमित हैं।
स्रोत
2012-02-21 20:04:35
कोई डबल पॉइंटर एक बहुआयामी सरणी नहीं है। –
निश्चित रूप से नहीं, लेकिन आप इसे एक सरणी की तरह व्यवहार कर सकते हैं – Akshay
जब आप बस एक का उपयोग कर सकते हैं तो 2 डी सरणी के अनुकरण का उपयोग क्यों करें? –