शुरूवातिहरूदेखि उन्नतसम्म! C भाषा 2‑आयामिक एरेको प्रयोग र उदाहरण

目次

1. परिचय

C Gengo प्रोग्रामिङ भाषा मध्ये अत्यन्त महत्वपूर्ण र इतिहाससम्पन्न भाषाहरू मध्ये एक हो। त्यसमा 「hairetsu」 (एरे) डेटा प्रभावकारी रूपमा व्यवस्थापन र सञ्चालन आवश्यक मूलभूत कार्य हो। विशेष गरी 「2-jigen hairetsu」 (द्वि-आयामी एरे) पङ्क्ति-स्तम्भ वा तालिका स्वरूपको डेटा ह्यान्डल गर्दा अत्यन्त उपयोगी हुन्छ।

यस लेखमा, C Gengo को द्वि-आयामी एरे बारेमा, शुरुआतीहरूलाई पनि बुझ्न सजिलो रूपमा व्याख्या गर्नेछौं। मूलभूत प्रयोगबाट उन्नत प्रयोग विधिसम्म क्रमिक रूपमा व्याख्या गरी, पाठकहरूले वास्तविक रूपमा प्रोग्राम लेख्दा उपयोगी जानकारी प्रदान गर्नेछ।

C Gengo मा एरेको महत्व

C Gengo को एरे समान प्रकारका बहु डेटा एकै साथ व्यवस्थापन गर्न सक्ने डेटा संरचना हो। यसले व्यक्तिगत रूपमा भेरिएबल घोषणा गर्ने झन्झट घटाउँछ र कोडलाई संक्षिप्त राख्न मद्दत गर्छ। उदाहरणका लागि, धेरै संख्याहरू वा स्ट्रिङहरू संग्रह गर्न एरे प्रयोग गर्दा प्रभावकारी रूपमा सञ्चालन गर्न सकिन्छ।

विशेष गरी 「2-jigen hairetsu」 तलका परिस्थितिहरूमा उपयोगी हुन्छ:

  • Mathematical matrix calculation
  • Management of game boards (chess, Othello, etc.)
  • Processing of structures like data tables and spreadsheets

यस लेखमा सिक्न सकिने कुरा

यस लेखमा, तलका सामग्रीहरू क्रमिक रूपमा सिक्न सकिन्छ:

  1. 2-आयामी ऐरेको आधारभूत संरचना र यसको घोषणा गर्ने तरिका
  2. प्रारम्भिकरण र तत्वहरूमा पहुँच गर्ने तरिका
  3. मेमोरीमा 2-आयामी ऐरेको व्यवस्थापन
  4. वास्तविक प्रोग्राममा अनुप्रयोगका उदाहरणहरू
  5. डायनामिक रूपमा 2-आयामी एरे सुरक्षित गर्ने र मुक्त गर्ने विधि
  6. एरे प्रयोग गर्दा ध्यान दिनुपर्ने बुँदाहरू र प्रायः हुने त्रुटिहरू

शुरुआतीहरू पनि, यो लेख पढेर द्वि-आयामी एरेको मूलभूत ज्ञान हासिल गर्न, र वास्तविक प्रोग्राममा प्रयोग गर्न सक्ने सीप प्राप्त गर्न सक्छन्।

कसलाई लक्षित लेख हो

यो व्याख्या C Gengo को अध्ययन सुरु गरेका शुरुआतीहरूदेखि, प्रोग्रामको प्रयोग दायरा विस्तार गर्न चाहने मध्यवर्ती स्तरका व्यक्तिहरूलाई लक्षित गर्दछ। विशेष गरी तलका व्यक्तिहरूलाई उपयोगी सामग्री हो:

  • People who have a basic understanding of arrays but have never used 2D arrays.
  • People who want to handle tabular data in a program
  • People who want to review basic C operations

2. 2-आयामी एरे के हो

C भाषा मा「2-आयामी एरे」 भनेको डेटा लाई पङ्क्ति र स्तम्भको स्वरूपमा संग्रह गर्न सक्ने डेटा संरचना हो। यो एउटा「एरेको एरे」को रूपमा कार्य गर्दछ। उदाहरणका लागि, पङ्क्ति-स्तम्भ गणना वा तालिका स्वरूपको डेटा प्रशोधनमा यो अत्यन्त उपयोगी हुन्छ, र प्रोग्राम भित्र प्रायः प्रयोग गरिन्छ।

यहाँ, 2-आयामी एरेको मूल अवधारणा र यसको संरचना बारे विस्तृत रूपमा व्याख्या गरिन्छ।

2-आयामी एरेको मूल संरचना

2-आयामी एरे धेरै पङ्क्ति र स्तम्भहरूबाट बनिएको हुन्छ। विशेष गरी, प्रत्येक पङ्क्ति 1-आयामी एरे हो, र तिनीहरूलाई मिलाएर 2-आयामी एरे बनाइन्छ।

उदाहरण: 2-आयामी एरेको छवि

तलको चित्र जस्तै, पङ्क्ति र स्तम्भ प्रयोग गरेर डेटा संग्रह गरिन्छ:

array[][4] = {
  {1, 2, 3, 4},
  {5, 6, 7, 8},
  {9, 10, 11, 12}
};

यस अवस्थामा, array 3 पङ्क्ति 4 स्तम्भको 2-आयामी एरे हो। इन्डेक्स प्रयोग गरेर, विशेष तत्वमा पहुँच गर्न सकिन्छ।

2-आयामी एरेको प्रयोगहरू

2-आयामी एरे निम्न जस्ता परिस्थितिहरूमा प्रयोग गरिन्छ:

यी प्रयोगहरूबाट स्पष्ट हुन्छ कि, 2-आयामी एरे जटिल डेटा प्रभावकारी रूपमा व्यवस्थापन गर्नको लागि मूल संर रूपमा अत्यन्त महत्वपूर्ण छ।

2-आयामी एरे र 1-आयामी एरेको भिन्नता

1-आयामी एरेको विशेषता

1-आयामी एरे सरल रूपमा「रेखीय」मा डेटा संग्रह गर्छ।

int array[5] = {1, 2, 3, 4, 5};

यस अवस्थामा, इन्डेक्स प्रयोग गरेर क्रमशः डेटा सन्दर्भ गरिन्छ।

2-आयामी एरेको विशेषता

2-आयामी एरे「पङ्क्ति」र「स्तम्भ」को दुई आयाम प्रयोग गरेर डेटा संग्रह गर्छ।

int array[2][3] = {
  {1, 2, 3},
  {4, 5, 6}
};

यस अवस्थामा, पङ्क्ति र स्तम्भको संयोजनले डेटा सन्दर्भ गरिन्छ।

  • array[0][2]
  • array[1][0]

यसरी, 2-आयामी एरे जटिल डेटा संरचना ह्यान्डल गर्दा विशेष गरी उपयोगी हुन्छ।

年収訴求

3. द्वि-आयामी एरेको घोषणा र आरम्भिकरण

C भाषामा, द्वि-आयामी एरे प्रयोग गर्न पहिले घोषणा गर्नुपर्छ, आवश्यक परेमा आरम्भिकरण पनि गर्नुपर्छ। यहाँ, द्वि-आयामी एरेको घोषणा विधि र आरम्भिकरणका प्रकारहरूबारे विस्तृत रूपमा व्याख्या गरिन्छ।

द्वि-आयामी एरेको घोषणा विधि

द्वि-आयामी एरेको घोषणा यस प्रकार गरिन्छ:

प्रकार एरेनाम[पङ्क्ति संख्या][स्तम्भ संख्या];
  • Type nameintfloatchar
  • Number of rows and columns

घोषणा उदाहरण

तलको उदाहरणले int प्रकारको 3 पङ्क्ति 4 स्तम्भको द्वि-आयामी एरेको घोषणा देखाउँछ:

int array[3][4];

यस अवस्थामा, 3 पङ्क्ति 4 स्तम्भको डेटा राख्न सकिने मेमोरी क्षेत्र सुरक्षित गरिन्छ।

द्वि-आयामी एरेको आरम्भिकरण

द्वि-आयामी एरेलाई आरम्भिकरण गर्दा, घोषणा संगै आरम्भिक मान सेट गर्न सकिन्छ। आरम्भिकरणका केही विधिहरू छन्।

विधि 1: स्पष्ट रूपमा सबै तत्वहरूलाई आरम्भिकरण

तलको जस्तै, सबै तत्वहरूलाई आरम्भिकरण गर्न सम्भव छ:

int array[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};

@@

यस अवस्थामा, array मेमोरीमा तलको जस्तै संग्रहित हुन्छ:

1  2  3
4  5  6

@@

विधि 2: केही तत्वहरू मात्र आरम्भिकरण

आरम्भिकरण सूचीमा केही तत्वहरू मात्र निर्दिष्ट गर्न सकिन्छ। यस अवस्थामा, निर्दिष्ट नभएका तत्वहरू स्वचालित रूपमा 0 ले आरम्भिकरण हुन्छन्।

int array[2][3] = {
    {1, 2},
    {4}
};

@@

यो एरे तलको जस्तै संग्रहित हुन्छ:

1  2  0
4  0  0

विधि 3: {0} प्रयोग गरेर सबै तत्वहरूको शून्य आरम्भिकरण

सबै तत्वहरूलाई 0 ले आरम्भिकरण गर्न चाहनुहुन्छ भने, {0} प्रयोग गर्ने विधि सुविधाजनक छ:

int array[3][4] = {0};

@@

यस अवस्थामा, सबै तत्वहरू 0 मा सेट हुन्छन्।

आरम्भिकरण गर्दा ध्यान दिनुपर्ने बुँदा

  • The number of rows cannot be omitted The number of rows (the first dimension) must always be specified.
  int array[][4] = {
      {1, 2, 3, 4},
      {5, 6, 7, 8}
  };

@@

यसरी, स्तम्भ संख्या निर्दिष्ट गरेर आरम्भिकरण सूचीको आकारबाट पङ्क्ति संख्या स्वचालित रूपमा अनुमान गर्न सकिन्छ।

कोड उदाहरण: एरेको घोषणा र आरम्भिकरणको सारांश

तलको कोडले द्वि-आयामी एरेको घोषणा, आरम्भिकरण पछि प्रत्येक तत्वलाई आउटपुट गर्ने उदाहरण देखाउँछ:

#include 
int main() {
    int array[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("array[%d][%d] = %d
", i, j, array[i][j]);
        }
    }
    return 0;
}

आउटपुट परिणाम

array[0][0] = 1
array[0][1] = 2
array[0][2] = 3
array[1][0] = 4
array[1][1] = 5
array[1][2] = 6

4. द्वि-आयामी एरेको प्रयोग: तत्वहरूको सन्दर्भ र सञ्चालन

C भाषाको द्वि-आयामी एरेमा, प्रत्येक तत्वलाई पहुँच गर्न वा डेटा परिवर्तन गर्न सकिन्छ। यहाँ, तत्वहरूको सन्दर्भ विधि र सञ्चालन विधिहरूलाई विस्तृत रूपमा व्याख्या गरिन्छ।

तत्वहरूमा पहुँच

द्वि-आयामी एरेमा, पङ्क्ति नम्बर र स्तम्भ नम्बर निर्दिष्ट गरेर विशेष तत्वमा पहुँच गरिन्छ।

मूलभूत पहुँच विधि

array[rowNumber][colNumber]

@@

उदाहरणका लागि, तलको एरे छ:

int array[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};

उदाहरण: तत्वलाई आउटपुट गर्ने प्रोग्राम

#include 
int main() {
    int array[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };
    printf("array[0][0] = %d
", array[0][0]);
    printf("array[1][2] = %d
", array[1][2]);
    return 0;
}

आउटपुट परिणाम

array[0][0] = 1
array[1][2] = 6

तत्वको सञ्चालन

एरेको तत्वमा मान असाइन गरेर परिवर्तन गर्न पनि सम्भव छ।

मान परिवर्तन विधि

array[पङ्क्ति_संख्या][स्तम्भ_संख्या] = नयाँ_मूल्य;

उदाहरण: मान परिवर्तन गर्ने प्रोग्राम

#include 
int main() {
    int array[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };
    // मान परिवर्तन
    array[0][0] = 10;
    array[1][2] = 20;
    // परिणाम प्रिन्ट
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("array[%d][%d] = %d\n", i, j, array[i][j]);
        }
    }
    return 0;
}

आउटपुट परिणाम

array[0][0] = 10
array[0][1] = 2
array[0][2] = 3
array[1][0] = 4
array[1][1] = 5
array[1][2] = 20

द्वि-आयामी एरेको लूप सञ्चालन

द्वि-आयामी एरेलाई सञ्चालन गर्दा, नेस्टेड लूप प्रयोग गर्नु सामान्य हो।

पङ्क्ति र स्तम्भलाई लूपमा सञ्चालन गर्ने उदाहरण

#include 
int main() {
    int array[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };
    // एरेका तत्वहरू क्रमबद्ध रूपमा प्रिन्ट गर्नुहोस्
    for (int i = 0; i < 2; i++) { // पङ्क्ति लूप गर्नुहोस्
        for (int j = 0; j < 3; j++) { // स्तम्भ लूप गर्नुहोस्
            printf("array[%d][%d] = %d\n", i, j, array[i][j]);
        }
    }
    return 0;
}

आउटपुट परिणाम

array[0][0] = 1
array[0][1] = 2
array[0][2] = 3
array[1][0] = 4
array[1][1] = 5
array[1][2] = 6

अनुप्रयोग उदाहरण: सबै तत्वलाई निश्चित मानमा सेट गर्ने

लूप प्रयोग गरेर, सबै तत्वलाई निश्चित मानले आरम्भिकरण गर्न पनि सम्भव छ।

सबै तत्वलाई 5 मा सेट गर्ने उदाहरण

#include 
int main() {
    int array[3][3];
    // सबै तत्वहरूलाई 5 मा सेट गर्नुहोस्
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            array[i][j] = 5;
        }
    }
    // परिणाम आउटपुट गर्नुहोस्
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("array[%d][%d] = %d
", i, j, array[i][j]);
        }
    }
    return 0;
}

आउटपुट परिणाम

array[0][0] = 5
array[0][1] = 5
array[0][2] = 5
array[1][0] = 5
array[1][1] = 5
array[1][2] = 5
array[2][0] = 5
array[2][1] = 5
array[2][2] = 5

5. द्वि-आयामी एरेको मेमोरी संरचना र त्यसको बुझाइ

C gengo ma द्वि-आयामी एरे memory मा कसरी व्यवस्था गरिन्छ बुझ्नु महत्त्वपूर्ण छ। यो बुझाइले प्रोग्रामको कार्यक्षमता सुधार्न र पोइन्टर प्रयोग गरेर सञ्चालनलाई अझ सहज बनाउँछ।

यहाँ, द्वि-आयामी एरेको मेमोरी संरचना बारे विस्तृत रूपमा व्याख्या गरिन्छ।

द्वि-आयामी एरेको मेमोरी व्यवस्था

C gengo ko द्वि-आयामी एरे वास्तवमा 1-आयामी निरन्तर मेमोरीमा संग्रहित हुन्छ। यो व्यवस्था विधिलाई “row-major” (पङ्क्ति-प्राथमिक) भनिन्छ।

पङ्क्ति-प्राथमिक (row-major) भनेको

पङ्क्ति-प्राथमिक भनेको, एरेको डेटा पङ्क्ति अनुसार निरन्तर संग्रहित हुने विधि हो।

उदाहरण: एरेको मेमोरी व्यवस्था

तलको द्वि-आयामी एरेलाई उदाहरणको रूपमा लिन्छौं:

int array[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};

यो एरे मेमोरीमा तलको रूपमा संग्रहित हुन्छ:

मेमोरी विन्यास: 1  2  3  4  5  6

इन्डेक्स प्रयोग गरेर तत्वको सन्दर्भ

एरेको इन्डेक्स प्रयोग गर्दा, C gengo मा तलको जस्तो अभिव्यक्तिले तत्वलाई सन्दर्भ गर्छ:

array[i][j] = *(array + (i * स्तम्भ संख्या) + j)

उदाहरण: मेमोरी ठेगाना गणना

उपरोक्त एरे array[2][3] मा:

  • array[1][2]
  *(array + (1 * 3) + 2) = *(array + 5)

यो, एरे पङ्क्ति-प्राथमिक रूपमा संग्रहित भएको कारण, पहिलो पङ्क्ति (i = 1) मा 3 तत्वको मेमोरी स्किप गरी, थप दोस्रो स्तम्भ (j = 2) को स्थानलाई सन्दर्भ गर्ने हो।

पॉइन्टर प्रयोग गरेर द्वि-आयामी एरेको सञ्चालन

C gengo ko द्वि-आयामी एरेलाई पॉइन्टर प्रयोग गरेर सञ्चालन गर्न पनि सम्भव छ। यसले लचकता बढाउँछ।

पॉइन्टर र द्वि-आयामी एरेको सम्बन्ध

द्वि-आयामी एरे “एरेको एरे” को रूपमा परिभाषित भएकोले, तलको जस्तै पॉइन्टर प्रयोग गरेर पहुँच गर्न सकिन्छ:

int array[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};
int *ptr = &array[0][0];
printf("%d
", *(ptr + 4)); // आउटपुट: 5

यस अवस्थामा, पॉइन्टर ptr एरेको पहिलो तत्वलाई संकेत गर्छ, इन्डेक्स थपेर एरेभित्रका अन्य तत्वहरूमा पहुँच गर्न सकिन्छ।

मेमोरी व्यवस्थाको दृश्यात्मक व्याख्या

तलको चित्रले array[2][3] को मेमोरी व्यवस्थालाई दृश्यात्मक रूपमा देखाउँछ:

स्मृति: 1  2  3  4  5  6
सूचक:
  [0][0] [0][1] [0][2] [1][0] [1][1] [1][2]

यसरी, द्वि-आयामी एरे 1-आयामी निरन्तर मेमोरीमा संग्रहित हुन्छ।

प्रभावी सञ्चालनको लागि ध्यान दिनुपर्ने बुँदाहरू

द्वि-आयामी एरेलाई प्रभावी रूपमा सञ्चालन गर्न, तलका बुँदाहरूलाई ध्यानमा राखौं:

  1. पंक्ति प्राथमिकतामा पहुँच गर्नु
    एरेको तत्वहरूमा पहुँच गर्दा, पङ्क्ति स्थिर राखेर स्तम्भहरूमा सञ्चालन गर्ने लूप प्रभावकारी हुन्छ।
for (int i = 0; i < पंक्ति संख्या; i++) {
       for (int j = 0; j < स्तम्भ संख्या; j++) {
           // पंक्ति प्राथमिकता अनुसार पहुँच
       }
   }

यो विधिले मेमोरी क्यासको कार्यक्षमता अधिकतम बनाउँछ।

6. व्यावहारिक उदाहरणहरू: म्याट्रिक्स सञ्चालन र खेल बोर्ड निर्माण

2‑आयामिक एरेहरू गणितीय म्याट्रिक्स सञ्चालन, खेल बोर्डको अवस्था व्यवस्थापन आदि जस्ता वास्तविक प्रोग्रामहरूमा व्यापक रूपमा प्रयोग गरिन्छ। यहाँ, दुईवटा विशिष्ट उदाहरणको रूपमा 「म्याट्रिक्स सञ्चालन」 र 「खेल बोर्ड निर्माण」 लाई लिई, तिनीहरूको प्रयोगलाई विस्तृत रूपमा व्याख्या गरिन्छ।

म्याट्रिक्स सञ्चालनको उदाहरण

म्याट्रिक्स सञ्चालन गणित र इन्जिनियरिङ्ग क्षेत्रहरूमा बारम्बार प्रयोग गरिन्छ। 2‑आयामिक एरे प्रयोग गरेर, म्याट्रिक्सको जोड र गुणा सजिलै कार्यान्वयन गर्न सकिन्छ।

उदाहरण 1: म्याट्रिक्स जोड

म्याट्रिक्सको जोड गर्ने प्रोग्राम तल देखाइएको छ।

#include 
int main() {
    // दुई 3x3 म्याट्रिक्सहरू
    int matrix1[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    int matrix2[3][3] = {
        {9, 8, 7},
        {6, 5, 4},
        {3, 2, 1}
    };
    int result[3][3];
    // म्याट्रिक्स जोड
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            result[i][j] = matrix1[i][j] + matrix2[i][j];
        }
    }
    // परिणाम प्रिन्ट
    printf("म्याट्रिक्स जोडको परिणाम:
");
    for (int i = 0; i < 3; i++) {
        for ( j = 0; j < 3; j++) {
            printf("%d ", result[i][j]);
        }
        printf("
");
    }
    return 0;
}

आउटपुट परिणाम

म्याट्रिक्स थप्ने परिणाम:
10 10 10
10 10 10
10 10 10

उदाहरणमा, दुईवटा 3×3 म्याट्रिक्सलाई प्रत्येक तत्व अनुसार जोडेर, परिणामलाई नयाँ म्याट्रिक्समा संग्रह गरिएको छ।

उदाहरण 2: म्याट्रिक्सको गुणा

म्याट्रिक्सको गुणा गर्ने प्रोग्राम तल देखाइएको छ।

#include 
int main() {
    // 2 वटा 3x3 म्याट्रिक्स
    int matrix1[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    int matrix2[3][3] = {
        {9, 8, 7},
        {6, 5, 4},
        {3, 2, 1}
    };
    int result[3][3] = {0};
    // म्याट्रिक्स गुणा
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            for (int k = 0; k < 3; k++) {
                result[i][j] += matrix1[i][k] * matrix2[k][j];
            }
        }
    }
    // परिणामको आउटपुट
    printf("म्याट्रिक्स गुणा परिणाम:
");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", result[i][j]);
        }
        printf }
    return 0;
}

आउटपुट परिणाम

म्याट्रिक्स गुणनको नतिजा:
30 24 18
84 69 54
138 114 90

खेल बोर्ड निर्माणको उदाहरण

2‑आयामिक एरेहरू खेल बोर्डको व्यवस्थापनमा पनि प्रायः प्रयोग गरिन्छ। यहाँ, सरल ओसेलो बोर्डलाई उदाहरणको रूपमा लिइएको छ।

उदाहरण: ओसेलो बोर्डको आरम्भिकरण र आउटपुट

#include 
int main() {
    // 8x8 को ओसेलो बोर्ड प्रारम्भिकरण
    int board[8][8] = {0};
    // प्रारम्भिक अवस्था सेट गर्नुहोस्
    board[3][3] = 1; // सेतो
    board[3][4] = 2; // कालो
    board[4][3] = 2; // कालो
    board[4][4] = 1; // सेतो
    // बोर्डको आउटपुट
    printf("ओसेलो बोर्डको प्रारम्भिक अवस्था:
");
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            printf("%d ", board[i][j]);
        }
        printf("\n");
    }
    return 0;
}

आउटपुट परिणाम

ओसेरो बोर्डको प्रारम्भिक अवस्था:
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 1 2 0 0 0
0 0 0 2 1 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

यसोग्राममा, 0 लाई खाली, 1 लाई सेतो, 2 लाई कालोको रूपमा बोर्डलाई आरम्भिकरण गरी, कन्सोलमा आउटपुट गरिएको छ।

7. द्वि-आयामी सरणी र पोइन्टरको सम्बन्ध

C भाषामा, द्वि-आयामी सरणी र पोइन्टर घनिष्ठ सम्बन्ध राख्छन्। पोइन्टर प्रयोग गरेर, द्वि-आयामी सरणीलाई प्रभावकारी रूपमा सञ्चालन गर्न सकिन्छ। यहाँ, द्वि-आयामी सरणी र पोइन्टरको आधारभूत सम्बन्धदेखि व्यावहारिक प्रयोग उदाहरणसम्म व्याख्या गरिन्छ।

द्वि-आयामी सरणी र पोइन्टरको आधारभूत सम्बन्ध

द्वि-आयामी सरणी वास्तवमा “सरणीको सरणी” को रूपमा कार्यान्वयन गरिएको छ। त्यसैले, प्रत्येक पङ्क्तिलाई पोइन्टरको रूपमा ह्यान्डल गर्न सकिन्छ।

उदाहरण: द्वि-आयामी सरणीको आधारभूत संरचना

ुसार, द्वि-आयामी सरणी घोषणा गरिन्छ:

int array[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};

यो सरणी मेमोरीमा तल देखाइँजस्तै व्यवस्थित हुन्छ:

[1] [2] [3] [4] [5] [6]
  • array
  • array[i]
  • array[i][j]

पोइन्टरद्वारा तत्वलाई सन्दर्भ गर्नु

पोइन्टर गणना प्रयोग गरेर, सरणीका तत्वलाई तल देखाइँजर्भ गर्न सकिन्छ।

*(array[0] + 1) // array[0][1] समान
*(*(array + 1) + 2) // array[1][2] समान

द्वि-आयामी सरणीलाई पोइन्टरको रूपमा ह्यान्डल गर्नु

यदि कार्यमा द्वि-आयामी सरणी पास गर्नुपर्दछ भने, पोइन्टर प्रयोग गर्दा सुविधाजनक हुन्छ। तल, कार्यमा द्वि-आयामी सरणी सञ्चालन गर्ने उदाहरण देखाइन्छ।

उदाहरण: कार्यमा द्वि-आयामी सरणी सञ्चालन

#include 
// फङ्सन परिभाषा
void printArray(int (*array)[3], int rows) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", array[i][j]);
        }
        printf("\n");
    }
}
int main() {
    int array[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };
    // एरेलाईङ्सनमा पठाउने
    printArray(array, 2);
    return 0;
}

आउटपुट परिणाम

1 2 3
4 5 6

मुख्य बुँदा

  • int (*array)[3]
  • Within a function, you can access elements using rows and columns.

पोइन्टर प्रयोग गरेर गतिशील द्वि-आयामी सरणीको सञ्चालन

पोइन्टर प्रयोग गरेर, गतिशील रूपमा द्वि-आयामी सरणी निर्माण गर्न पनि सम्भव छ।

उदाहरण: गतिशील रूपमा द्वि-आयामी सरणी निर्माण

#include 
#include 
int main() {
    int rows = 2, cols = 3;
    // गतिशील स्मृति आवंटन
    int** array = malloc(rows * sizeof(int*));
    for (int i = 0; i < rows; i++) {
        array[i] = malloc(cols * sizeof(int));
    }
    // ऐरेमा मानहरू असाइन गर्नुहोस्
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            array[i][j] = i * cols + j + 1;
        }
    }
    // ऐरेको आउटपुट
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", array[i][j]);
        }
        printf("\n");
    }
    // स्म मुक्त गर्नुहोस्
    for (int i = 0; i < rows; i++) {
        free(array[i]);
    }
    free(array);
    return 0;
}

आउटपुट परिणाम

1 2 3
4 5 6

8. गतिशील रूपमा द्वि-आयामी सरणी सुरक्षित गर्ने र मुक्त गर्ने विधि

C भाषामा, गतिशील मेमोरी आवंटन प्रयोग गरेर, कार्यक्रम चलिरहेको बेला आवश्यक आकारको द्वि-आयामी सरणी लचिलो रूपमा निर्माण गर्न सकिन्छ। यसले स्थिर आकारको सरणीले समाधान गर्न नसक्ने अवस्थामा पनि मेमोरीलाई प्रभावकारी रूपमा प्रयोग गर्न मद्दत गर्छ। यहाँ, गतिशील रूपमा द्वि-आयामी सरणी सुरक्षित गर्ने, सञ्चालन गर्ने र पछि मुक्त गर्ने विधि बारे विस्तृत रूपमा व्याख्या गरिन्छ।

गतिशील मेमोरी आवंटनको आधारभूत

गतिशील मेमोरी आवंटनमा, malloc फङ्सन वा calloc फङ्सन प्रयोग गरिन्छ। गतिशील मेमोरी प्रयोग गर्दा, सरणीको आकारलाई कार्यक्रम चल्ने समयमा निर्धारण गर्न सकिन्छ।

गतिशील द्वि-आयामी सरणी निर्माण विधि

गतिशील रूपमा द्वि-आयामी सरणी निर्माण गर्दा, तलका दुई विधिहरू छन्:

  1. प्वाइन्टरको एरे प्रयोग गर्ने तरिका
  2. फ्ल्याट 1-आयामी एरेलाई 2-आयामी रूपमा ह्यान्डल गर्ने तरिका

विधि 1: पोइन्टरको सरणी प्रयोग गर्ने विधि

यस विधिमा, प्रत्येक पङ्क्तिको लागि गतिशील रूपमा मेमोरी सुरक्षित गरिन्छ।

क्रम
  1. पंक्तिको सङ्ख्यामा पोइन्टर एरे सुरक्षित गर्नुहोस्।
  2. प्रत्येक पङ्क्तिको स्मृति स्तम्भ संख्यामा अनुरूप सुरक्षित गर्नुहोस्।
उदाहरण: गतिशील रूपमा द्वि-आयामी सरणी सुरक्षित गरेर प्रयोग गर्ने
#include 
#include 
int main() {
    int rows = 3, cols = 4;
    // पंक्तिहरूको संख्या अनुसार पोइन्टर ऐरे सुरक्षित गर्नुहोस्
    int** array = malloc(rows * sizeof(int*));
    // प्रत्येक पंक्तिको मेमोरी स्तम्भ संख्या अनुसार सुरक्षित गर्नुहोस्
    for (int i = 0; i < rows; i++) {
        array[i] = malloc(cols * sizeof(int));
    }
    // ऐरेमा मानहरू असाइन गर्नुहोस्
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            array[i][j] = i * cols + j + 1;  // मान गणना गरेर असाइन गर्नुहोस्
        }
    }
    // ऐरेको सामग्री आउटपुट गर्नुहोस्
    printf("डायनामिक रूपमा सुरक्षित गरिएको 2-आयामी ऐरे:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", array[i][j]);
        }
        printf("\n");
    }
    // मेमोरी मुक्त गर्नुहोस्
    for (int i = 0; i < rows; i++) {
        free(array[i]);  // प्रत्येक पंक्ति मुक्त गर्नुहोस्
    }
    free(array);  // पोइन्टर ऐरे मुक्त गर्नुहोस्
    return 0;
}

आउटपुट परिणाम

गतिशील रूपमा आवंटित 2-आयामी सरणी:
1 2 3 4
5 6 7 8
9 10 11 12

विधि 2: फ्ल्याट 1-आयामी सरणी प्रयोग गर्ने विधि

यस विधिमा, सम्पूर्ण द्वि-आयामी सरणीलाई 1-आयामी सरणीको रूपमा सुरक्षित गरी, सूचकांक गणना प्रयोग गरेर द्वि-आयामी रूपमा ह्यान्डल गरिन्छ।

क्रम
  1. पंक्ति × स्तम्भको मेमोरी एकै पटकमा आवंटन गर्नुहोस्।
  2. इन्डेक्स गणना गरेर तत्वलाई सन्दर्भ गर्नुहोस्।
उदाहरण: फ्ल्याट 1-आयामी सरणी प्रयोग गरेर द्वि-आयामी सरणी निर्माण
#include 
#include 
int main() {
    int rows = 3, cols = 4;
    // स्मृति एकै पटकमा आवंटन गर्नुहोस्
    int* array = malloc(rows * cols * sizeof(int));
    // एरेमा मानहरू असाइन गर्नुहोस्
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            array[i * cols + j] = i * cols + j + 1;
        }
    }
    // एरेको सामग्री प्रिन्ट गर्नुहोस्
    printf("फ्ल्याट 1-आयामी एरे प्रयोग गरेर 2-आयामी एरे:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", array[i * cols + j]);
        }
        printf("\n");
    }
    // स्मृति मुक्त गर्नुहोस्
    free(array);
    return 0;
}

आउटपुट परिणाम

फ्लैट 1-आयामी एरे प्रयोग गरेर 2-आयामी एरे:
1 2 3 4
5 6 7 8
9 10 11 12

गतिशील मेमोरी आवंटनको ध्यान दिनुपर्ने बुँदा

  1. मेमोरी लीकको रोकथाम
    गतिशील रूपमा सुरक्षित गरिएको मेमोरीलाई मुक्त गर्न नबिर्सनु भएमा, मेमोरी लीक हुन्छ। सधैं free कृपया X प्रयोग गरेर मेमोरी मुक्त गर्नुहोस्।
  2. स्मृति आवंटन त्रुटि जाँच
    malloccalloc परिणामलाई अवश्यै जाँच गर्नुहोस्। मेमोरी कम भएमा,NULL वापसी गरिन्छ।
if (array == NULL) {
       printf("स्मृति आवंटन असफल भयो।
");
       return 1;
   }
  1. आकार गणनामा ध्यान दिनुहोस्
    आवश्यक आकारलाई सही रूपमा गणना गर्नुहोस्, र उपयुक्त मात्रामा मेमोरी सुरक्षित गर्नुहोस्।

9. 2-आयामी एरे प्रयोग गर्दा ध्यान दिनुपर्ने बुँदाहरू

2-आयामी एरे उपयोगी र शक्तिशाली डेटा संरचना हो, तर गलत तरिकाले प्रयोग गर्दा बग वा मेमोरी लीक जस्ता समस्याहरू उत्पन्न हुन सक्छ। यहाँ, 2-आयामी एरे प्रयोग गर्दा ध्यान दिनुपर्ने बुँदाहरू र सामान्य त्रुटिहरूको बारेमा व्याख्या गरिएको छ।

सीमा बाहिर पहुँच रोकथाम

2-आयामी एरे प्रयोग गर्दा, एरेको सीमा बाहिर पहुँच गर्दा अनपेक्षित व्यवहार वा प्रोग्राम क्र्यास हुन सक्छ।

उदाहरण: सीमा बाहिर पहुँच समस्या

#include 
int main() {
    int array[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };
    // सीमा बाहिर पहुँच (त्रुटि)
    printf("%d
", array[2][0]);  // अस्तित्वमा नभएको पङ्क्ति सन्दर्भ
    return 0;
}

यो प्रोग्राममा, array[2][0] मा पहुँच गर्ने प्रयास गर्छ, तर एरे केवल दोस्रो पङ्क्ति (array[1]) सम्म मात्र अस्तित्वमा छ, त्यसैले अपरिभाषित व्यवहार उत्पन्न हुन्छ।

रोकथाम उपाय

  1. एरेको पङ्क्ति र स्तम्भको सङ्ख्या नाघ्न नदिन लूपको सर्त सेट गर्नुहोस्।
  2. आवश्यकता अनुसार सीमा जाँच लागू गर्नुहोस्।
सुधारिएको संस्करण
for (int i = 0; i < 2; i++) { // सही पङ्क्तिहरू सम्म लूप
    for (int j = 0; j < 3; j++) {
        printf("%d ", array[i][j]);
    }
}

मेमोरी लीक रोकथाम

डायनामिक रूपमा सुरक्षित गरिएको 2-आयामी एरेलाई उचित रूपमा मुक्त नगरेमा मेमोरी लीक उत्पन्न हुन्छ।

उदाहरण: मेमोरी लीक

तलको कोडमा, मुक्त गर्ने कार्य अपर्याप्त छ।

#include 
int main() {
    int rows = 2, cols = 3;
    // गतिशील स्मृति आवंटन
    int** array = malloc(rows * sizeof(int*));
    for (int i = 0; i < rows; i++) {
        array[i] = malloc(cols * sizeof(int));
    }
    // स्मृति मुक्त गर्न बिर्सनु
    free(array);
    return 0;
}

यो कोडमा, प्रत्येक पङ्क्तिमा सुरक्षित गरिएको मेमोरी मुक्त नगरेको कारण मेमोरी लीक उत्पन्न हुन्छ।

रोकथाम उपाय

डायनामिक रूपमा सुरक्षित गरिएको मेमोरीलाई मुक्त गर्दा, तलको क्रममा मुक्त गर्नुहोस्।

  1. प्रत्येक पंक्ति (एरेको प्रत्येक भाग) मुक्त गर्नुहोस्।
  2. पंक्ति सूचकलाई आफैँ मुक्त गर्‍यो।
सही मुक्त गर्ने क्रम
for (int i = 0; i < rows; i++) {
    free(array[i]); // प्रत्येक पंक्ति फ्री गर्नुहोस्
}
free(array); // पंक्ति सूचक फ्री गर्नुहोस्

आकार परिवर्तनको प्रतिबन्ध

C भाषामा, स्थिर एरेको आकार एक पटक परिभाषित गरेपछि परिवर्तन गर्न सकिँदैन। लचिलो रूपमा आकार परिवर्तन गर्न चाहनुहुन्छ भने, डायनामिक एरे प्रयोग गर्नुपर्छ।

उपाय

  1. आवश्यकताअनुसार गतिशील ऐरे प्रयोग गर्नुहोस्।
  2. यदि साइज परिवर्तनहरू बारम्बार हुन्छन् भने,realloc लाई प्रयोग गरेर मेमोरी पुनः आवंटन गर्नुहोस्।

एरेको आरम्भ

एरेको आरम्भ बिर्सिएमा, अनपेक्षित कचरा मान (अआरम्भित मेमोरी) प्रयोग हुन सक्छ।

उदाहरण: आरम्भ बिर्सनु

int array[2][3];
printf("%d
", array[0][0]); // कचरा मानहरू आउटपुट हुन सक्छ

रोकथाम उपाय

  1. एरे घोषणा गर्दा आरम्भ गर्नुहोस्।
int array[2][3] = {0}; // सबै तत्वहरूलाई 0 मा आरम्भ गर्नुहोस्
  1. डायनामिक एरेको अवस्थामा,calloc लाई प्रयोग गरेर प्रारम्भिकरण गर्ने。
   int* array = calloc(rows * cols, sizeof(int));

मेमोरी दक्षता र क्याच प्रभाव

एरेलाई प्रभावकारी रूपमा सञ्चालन गर्न, पङ्क्ति-प्राथमिक (row-major) क्रममा पहुँच गर्नु महत्त्वपूर्ण छ।

पङ्क्ति-प्राथमिक पहुँचको उदाहरण

for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++) {
        // पहिले पङ्क्ति स्थिर गरेर स्तम्भ सञ्चालन गर्नुहोस्
        printf("%d ", array[i][j]);
    }
}

स्तम्भ-प्राथमिक पहुँचको अकार्यक्षमता

स्तम्भ-प्राथमिक रूपमा पहुँच गर्दा, क्याच दक्षता घट्छ र प्रदर्शन बिग्रन सक्छ।

सामान्य त्रुटिहरूको जाँच सूची

तलको सूचीमा, 2-आयामी एरे प्रयोग गर्दा सामान्य त्रुटिहरू समावेश छन्। प्रोग्राम लेख्दा यीलाई जाँच गर्नुहोस्।

  1. एरेको सीमा बाहिर पहुँच गरिरहनुभएको छैन?
  2. गतिशील रूपमा आवंटित गरिएको सबै मेमोरी मुक्त गरिरहनुभएको छ?
  3. एरेलाई प्रयोग गर्नु अघि प्रारम्भिकरण गर्नुभएको छ?
  4. आकार परिवर्तन आवश्यक भएमा, उपयुक्त रूपमा पुनः आवंटन गरिरहनुभएको छ कि?
  5. पंक्ति प्राथमिकता क्रममा पहुँच गरिरहनुभएको छ?

10. सारांश

यस लेखमा, C भाषा मा द्वि-आयामी एरेको बारेमा, आधारभूतदेखि उन्नतसम्म चरणबद्ध रूपमा व्याख्या गरिएको छ। द्वि-आयामी एरे म्याट्रिक्स गणना, डेटा व्यवस्थापन, खेल बोर्ड निर्माण आदि जस्ता विभिन्न प्रोग्रामिङ परिस्थितिहरूमा उपयोगी डेटा संरचना हो। यहाँ, अहिलेसम्म सिकेका महत्वपूर्ण बुँदाहरूलाई पुनरावलोकन गरिन्छ।

1. द्वि-आयामी एरेको मूल संरचना

  • A 2-dimensional array consists of “rows” and “columns”.
  • The declaration method is as follows:
int array[पङ्क्ति_संख्या][स्तम्भ_संख्या];
  • Use an index to access elements:
array[पङ्क्ति_संख्या][स्तम्भ_संख्या];

2. आरिकरण र तत्वको सञ्चालन

  • There are several ways to initialize arrays:
  • Explicit initialization:c int array[2][3] = { {1, 2, 3}, {4, 5, 6} };
  • Zero-initialize all elements:c int array[2][3] = {0};
  • You can operate efficiently using loops.

3. मेमोरी संरचना र पोइन्टरको सम्बन्ध

  • 2-dimensional arrays are stored in memory in “row-major” order.
  • You can manipulate a two-dimensional array using pointers:
  *(*(array + i) + j);
  • When passing a 2D array to a function, you need to specify the number of columns:
void printArray(int (*array)[columnCount], int rowCount);

4. गतिशील द्वि-आयामी एरेको आवंटन र मुक्तिकरण

  • By using dynamic memory allocation, you can flexibly determine the array size at runtime.
  • Method using an array of pointers:
  int** array = malloc(rows * sizeof(int*));
  for (int i = 0; i < rows; i++) {
      array[i] = malloc(cols * sizeof(int));
  }
  • Release memory properly:
  for (int i = 0; i < rows; i++) {
      free(array[i]);
  }
  free(array);

5. ध्यान दिनुपर्ने बुँदाहरू

  • Out-of-bounds access
  • Uninitialized array
  • When using dynamic memory allocation, always free it.

द्वि-आयामी एरे प्रयोग गर्ने फाइदाहरू

द्वि-आयामी एरे तलका परिस्थितिहरूमा उपयोगी हुन्छ:

  1. मैट्रिक्स गणनागणितीय गणनाहरूलाई दक्षतापूर्वक प्रक्रिया गर्न सकिन्छ।
  2. गेम विकास: चेस र ओसेरो जस्ता बोर्ड खेलहरूको स्थिति व्यवस्थापन।
  3. डेटा प्रशोधन: स्प्रेडशीट र तालिका स्वरूपका डेटा व्यवस्थापन।
  4. छवि प्रक्रिया: पिक्सेल डेटा व्यवस्थापनको लागि डेटा संरचना।

आगामी चरणहरू

द्वि-आयामी एरेलाई बुझेर, C भाषाको प्रोग्रामिङ कौशल ठूलो रूपमा सुधार हुन्छ। अर्को चरणको रूपमा, तलका विषयहरूमा काम गर्न सिफारिस गरिन्छ:

  • बहु-आयामी सरणी: 3-आयामी एरेहरू र त्यसभन्दा माथि को एरेहरू कसरी ह्यान्डल गर्ने।
  • प्वाइन्टरको अनुप्रयोग: एरेलाई पोइन्टरको मद्दतले अझ बढी दक्षतापूर्वक कसरी सञ्चालन गर्ने तरिका।
  • मेमोरी व्यवस्थापनको गहिरो अन्वेषण: realloc लाई प्रयोग गरेर एरेको आकार परिवर्तन र उन्नत मेमोरी सञ्चालन।

अन्तमा

यस लेखमार्फत, द्वि-आयामी एरेको आधारभूतदेखि उन्नतसम्म सिक्न सकियो। यी ज्ञानलाई प्रयोग गरी, अझ प्रभावकारी र शक्तिशाली प्रोग्राम बनाउनुहोस्। C भाषाको अध्ययन दोहोर्याइ अभ्यास गर्नु महत्त्वपूर्ण छ। यदि प्रश्न वा अस्पष्टता छ भने, आधिकारिक दस्तावेज वा थप अध्ययन सामग्रीलाई सन्दर्भ गर्नुहोस्।

年収訴求