2012-12-23 16 views
8

संभव डुप्लिकेट ग में सूचक के माध्यम से एक 2 डी सरणी पारित करने के लिए:
Passing a pointer representing a 2D array to a function in C++कैसे

मैं सूचक के माध्यम से एक समारोह के लिए अपने 2-आयामी सरणी पारित करने के लिए कोशिश कर रहा हूँ और संशोधित करना चाहते हैं मूल्य।

#include <stdio.h> 

void func(int **ptr); 

int main() { 
    int array[2][2] = { 
     {2, 5}, {3, 6} 
    }; 

    func(array); 

    printf("%d", array[0][0]); 
    getch(); 
} 

void func(int **ptr) { 
    int i, j; 
    for (i = 0; i < 2; i++) { 
     for (j = 0; j < 2; j++) { 
      ptr[i][j] = 8; 
     } 
    } 
} 

लेकिन कार्यक्रम इस के साथ दुर्घटनाओं। मैंने गलत क्या किया?

+2

उचित प्रकार का प्रयोग करें, 'शून्य समारोह (पूर्णांक (* पीआरटी) [2]) ', या पॉइंटर्स की एक सरणी पास करें। –

+0

[मैं सी ++ में सरणी का उपयोग कैसे करूं?] (Http://stackoverflow.com/q/4810664/1202636) – effeffe

+0

Arrays पॉइंटर्स नहीं हैं। पॉइंटर्स सरणी नहीं हैं। आपने जो किया वह गलत नहीं है जब तक कि आप इसे संदेह नहीं करना बंद कर देते हैं। –

उत्तर

3

यह क्रैश होता है क्योंकि एक सरणी सूचक के लिए सूचक नहीं है, यह सरणी मानों को पढ़ने की कोशिश करेगा जैसे कि वे पॉइंटर्स हैं, लेकिन किसी सरणी में बिना किसी पॉइंटर के डेटा होता है।
एक सरणी स्मृति में सभी निकट है, बस एक ही सूचक स्वीकार करते हैं और जब फ़ंक्शन को कॉल एक डाली कार्य करें:

func((int*)array); 

...

void func(int *ptr) { 
    int i, j; 
    for (i = 0; i < 2; i++) { 
     for (j = 0; j < 2; j++) { 
      ptr[i+j*2]=8; 
     } 
    } 
} 
+0

धन्यवाद। आपने मेरा दिन बना दिया। लेकिन अगर मैं अलग-अलग चीजों को एक सरणी में स्टोर करना चाहता हूं तो मैं और जे को कैसे सेट करूं ?? –

+0

मुझे समझ में नहीं आया कि आपका क्या मतलब है। –

9

आपकी सरणी int[2][2] ("2 int की 2 सरणी की सरणी" का प्रकार है) और इसका नाम अपने पहले तत्व के लिए एक सूचक को क्षय हो जाएगा जो int(*)[2] ("2 int की सरणी के लिए सूचक") होगा। तो इस प्रकार के एक तर्क लेने के लिए अपने func जरूरतों:

void func(int (*ptr)[2]); 
// equivalently: 
// void func(int ptr[][2]); 

वैकल्पिक रूप से, आप सरणी प्रकार ("2 पूर्णांक के 2 सरणी के सरणी के संदर्भ में") के लिए एक संदर्भ ले सकते हैं:

void func(int (&ptr)[2][2]); 

सुनिश्चित करें कि आप घोषणा और परिभाषा दोनों को बदल दें।