# Kaip kurti ir naudoti 2D masyvus C kalboje

Masyvai leidžia saugoti susijusių duomenų rinkinį C kalboje be būtinybės kurti kelis kintamuosius. Paprastai masyvai yra vienmatiniai, tačiau juos galima išplėsti iki bet kokio matmenų skaičiaus. Parodysime, kaip kurti 2D masyvus C kalboje ir kaip juos efektyviai naudoti.

## Kokie yra masyvų kūrimo C kalboje pagrindai?

Norėdami kurti ir valdyti 2D masyvus C kalba, turite žinoti šios struktūros pagrindus C programavimo kalba.

Kaip ir daugelyje kitų kalbų, masyvai C kalboje yra **atminties blokas**, kuriame galima saugoti keletą to paties duomenų tipo verčių. Tai leidžia išsaugoti ir sujungti kelias vertes po vienu kintamojo vardu. Masyvo dydis turi būti žinomas kompiliavimo metu ir vėliau negali būti keičiamas. Toliau pateiktas kodas iliustruoja, kaip kurti masyvus C kalboje:

```c
int numbers1[15];
// Optionally, the saved values can be specified when they are created:
int numbers2[5] = {1, 2, 3, 4, 5};
```

Duomenų tipas nurodomas prieš kintamojo vardą. Šiame pavyzdyje kvadratinės skliaustelės rodo, kad šis kintamasis nėra vienintelis vertė, o masyvas. Skaitmeninis skaičius tarp skliaustelių rodo, kiek šio duomenų tipo elementų galima saugoti masyve. Pateiktame pavyzdyje masyvas `number1` sukurtas **neinicijuotas**. Tai reiškia, kad laukuose nėra įrašytų verčių. Vėliau kodą galima užpildyti vertėmis.

Kita vertus, masyvas `number2` yra inicijuojamas rankiniu būdu jo sukūrimo metu. Šis metodas yra laiką eikvojantis dideliems masyvams, o gautas kodas dažnai yra nesuprantamas. Taigi, daugeliu atvejų tai nėra geriausias metodas. Paprastai geriau yra bandyti užpildyti masyvus **programiškai**. Tai galima padaryti, pavyzdžiui, naudojant for-loop:

```c
int numbers3[100];
for(int i = 0; i < 100; i++) {
numbers3[i] = i + 1;
}
// Creates an array containing the integers 1 to 100.
```

Tip Priklausomai nuo to, kokią operacinę sistemą turite, kokį C standartą naudojate ir kur savo programoje deklaravote neinicijuotą kintamąjį, šis kintamasis gali turėti atsitiktinę reikšmę. Tai taikoma ir masyvo laukams. Todėl geriausia nepasiekti laukų, kurių dar neinicijavote, ypač jei juose išsaugota reikšmė interpretuojama kaip **rodyklė**.

Sukūrus masyvą, galite naudoti jo indeksą, kad pasiektumėte atskiras reikšmes. Svarbu atkreipti dėmesį, kad masyvai prasideda nuo indekso 0. Tai parodys žemiau pateiktas pavyzdys:

```c
int numbers2[5] = {1, 2, 3, 4, 5};
numbers2[3] = numbers2[2];
printf("%d\n", numbers2[3]);
// Output: 3
```

2D masyvas gali būti sukurtas C kalba, sukuriant masyvą, kuriame **kiekvienas laukas turi kitą masyvą**. Daugiau apie 2D masyvus galite skaityti kitame skyriuje.

## Kaip sukurti 2D masyvus C kalba

2D masyvai C kalboje iš tiesų yra tik vienmatiai masyvai. Kiekvienas laukas tiesiog yra kitas masyvas. 2D masyvą galima suprasti kaip verčių **lentelę arba matricą**. 2D masyvus galima kurti ir užpildyti naudojant šią sintaksę:

```c
ints_two_dimensions[10][10];
ints_two_dimensions [0][1] = 0;
ints_two_dimensions [2][1] = 2;
ints_two_dimensions [9][4] = 36;
// etc.
```

Čia skaičius kairėje skliaustuose reiškia indeksą, kuriuo reikia pasiekti pirmąjį masyvą. Skaičius dešinėje reiškia indeksą antrajame masyve. Šiuos du skaičius galite įsivaizduoti kaip **2D koordinates arba eilučių ar stulpelių numerius**. Kaip ir vienmatės masyvai, dvimatės masyvai taip pat gali būti inicijuojami su reikšmėmis, kai jie yra sukurti.

```c
floats_two_dimensions[2][6] = {
{0.1, 3.56, 6.346, 8.9, 45.345, 2.284},
{7.0, 1.12, 9.74, 0.0, 3.56, 4.4}
}
```

Principas, kai vienas masyvas yra kito masyvo viduje, nėra ribojamas dviem matmenimis. Šį metodą galite naudoti kurdami **bet kokio matmenų skaičiaus** masyvus.

```c
int ints_four_dimensions[10][10][10][10];
```

## Kaip naudoti 2D masyvus C kalboje

### Kartokite per 2D masyvą

2D masyvai C kalboje (arba daugiamatės matricos) dažniausiai naudojami daugiamatėms duomenų struktūroms kurti. Toliau pateiktame pavyzdyje dvimatis masyvas užpildytas pakaitomis nuliais ir vienetais, kad atvaizduotų šachmatų lentą:

```c
#include <stdio.h>
#define ARRAY_LENGTH 8
int main() {
    int chessboard[8][8];
    for(int i = 0; i < ARRAY_LENGTH; i++) {
        for(int j = 0; j < ARRAY_LENGTH; j++) {
            chessboard[i][j] = (i + j) % 2;
            printf("%d", chessboard[i][j]);
        }
        printf("\n");
    }
    return 0;
}
/*
Output:
01010101
10101010
01010101
10101010
01010101
10101010
01010101
10101010
*/
```

### String masyvai

Jei norite sumaniai naudoti masyvus, svarbu nepamiršti, kad masyvas yra tik **rodyklė į atminties vietą,** ir būtent taip jį supranta C kompiliatorius. Indeksas, nurodytas rašant į atskirus laukelius arba skaitant iš jų, reiškia **poslinkį masyve, palyginti su baziniu adresu**. Pažvelkime į šį pavyzdį, kad geriau suprastume:

```c
#include <stdio.h>
int main() {
int number2[5] = {1, 2, 3, 4, 5};
printf("%d\n", *number2);
// Output: 1
printf("%d\n", *(number2 + 2));
// Output: 3
}
```

Stringai C kalboje yra traktuojami taip pat. **Stringą** galima **kartoti taip, tarsi ji būtų masyvas**. Tai matyti iš toliau pateikto pavyzdžio, kuriame trys masyve saugomi įrašai yra rašomi didžiosiomis raidėmis, po vieną simbolį. Norint pasiekti simbolius, naudojamas masyvo indeksas (skliaustelės):

```c
#include <stdio.h>
int main() {
    char* sentences[3];
    sentences[0] = "Hello, this is the first sentence.\n";
    sentences[1] = "This is the second sentence.\n";
    sentences[2] = "And now there are three.\n";
    printf("Original sentences:\n\n");
    for(int i = 0; i < 3; i++) {
        printf("%s", sentences[i]);
    }
    printf("\nChanged sentences:\n\n");
    for(int i = 0; i < 3; i++) {
        int j = 0;
        while(sentences[i][j] != '\n') {
            if(sentences[i][j] >= 'a' && sentences[i][j] <= 'z') {
                printf("%c", sentences[i][j] - 0x20);
            } else {
                printf("%c", sentences[i][j]);
            }
            j++;
        }
        printf("\n");
    }
}
/*
Output:
Original sentences:
Hello, this is the first sentence.
This is the second sentence.
And now there are three.
Changed sentences:
HELLO, THIS IS THE FIRST SENTENCE.
THIS IS THE SECOND SENTENCE.
AND NOW THERE ARE THREE.
*/
```


This is a markdown version of: [https://www.ionos.com/lt-lt/digitalguide/interneto-svetaines/interneto-svetainiu-kurimas/2d-masyvai-c-kalboje/](https://www.ionos.com/lt-lt/digitalguide/interneto-svetaines/interneto-svetainiu-kurimas/2d-masyvai-c-kalboje/) for AI/LLM consumption.