As matrizes permitem armazenar um conjunto de dados re­la­ci­o­na­dos em C sem ter de criar várias variáveis. Como regra geral, as matrizes são uni­di­men­si­o­nais, mas podem ser ex­pan­di­das para qualquer número de dimensões. Mostramos-lhe como criar matrizes 2D em C e como utilizá-las de forma eficaz.

Noções básicas sobre matrizes em C

Para poder criar e dominar efi­caz­mente as matrizes 2D em C, primeiro deve saber algumas coisas básicas sobre as matrizes na linguagem de pro­gra­ma­ção C. Como em muitas outras lin­gua­gens, as matrizes são um bloco de memória no qual podem ser ar­ma­ze­na­dos vários valores do mesmo tipo de dados. Isto permite guardar e resumir vários valores sob o mesmo nome de variável. O tamanho da matriz deve ser conhecido no momento da com­pi­la­ção e não pode ser mo­di­fi­cado pos­te­ri­or­mente. O bloco de código a seguir mostra como criar matrizes em C:

int cifras1[15]; 
// Opcionalmente, los valores almacenados pueden ser especificados al crear el array: 
int cifras2[5] = {1, 2, 3, 4, 5};
c

Neste exemplo, o tipo de dados a ser guardado é es­pe­ci­fi­cado, como de costume, antes do nome da variável. Os colchetes indicam que esta variável não é um valor único, mas sim uma matriz. O número inteiro entre colchetes indica quantos elementos deste tipo de dados podem ser ar­ma­ze­na­dos na matriz. No exemplo anterior, a matriz cifras1 é criada sem ini­ci­a­li­za­ção, o que significa que não são escritos valores nos campos. Estes podem ser pre­en­chi­dos com valores mais adiante no código.

A matriz cifras2, por outro lado, é ini­ci­a­li­zada ma­nu­al­mente quando criada. Essa abordagem não é re­co­men­dá­vel na maioria dos casos, pois consome muito tempo para matrizes grandes e o código re­sul­tante é fre­quen­te­mente ilegível. Portanto, é melhor tentar preencher as matrizes pro­gra­ma­ti­ca­mente, por exemplo, com um loop for:

cifras2[100]; 
for(int i = 0; i < 100; i++) { 
cifras2[i] = i + 1; 
} 
// Crea un array que contiene los números enteros del 1 al 100.
c
Nota

De­pen­dendo do sistema operativo em que estiver a trabalhar, do padrão C que estiver a utilizar e do local do seu programa em que declarou uma variável não ini­ci­a­li­zada, essa variável pode conter um valor aleatório. O mesmo ocorre com os campos de matriz. Portanto, é melhor não aceder a campos que ainda não tenha ini­ci­a­li­zado, es­pe­ci­al­mente se o valor ar­ma­ze­nado neles deve ser in­ter­pre­tado como um ponteiro.

Depois de criar uma matriz, o índice pode ser usado para aceder a valores in­di­vi­du­ais. Tenha em atenção que as matrizes começam com o índice 0. O exemplo seguinte serve para ilustrar isso:

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

Uma matriz 2D pode ser criada em C criando uma matriz em que cada campo contenha outra matriz. Continue a ler para saber mais.

Como criar uma matriz 2D em C

As matrizes 2D em C nada mais são do que matrizes uni­di­men­si­o­nais cujos campos contêm cada um outra matriz. Portanto, uma matriz 2D pode ser entendida como uma tabela ou matriz de valores. As matrizes 2D podem ser criadas e pre­en­chi­das com a seguinte sintaxe:

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

Aqui, o número entre colchetes à esquerda re­pre­senta o índice da primeira matriz a ser acedida e o número à direita re­pre­senta o índice da segunda. Estes dois números podem ser vi­su­a­li­za­dos como co­or­de­na­das bi­di­men­si­o­nais ou números de linha ou coluna. Tal como as matrizes uni­di­men­si­o­nais, as matrizes bi­di­men­si­o­nais também podem ser ini­ci­a­li­za­das com valores quando são criadas.

2d_floats[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} 
}
c

O princípio de uma matriz dentro de outra matriz não se limita a duas dimensões. Pode utilizar este método para criar matrizes com qualquer número de dimensões.

int 4d_ints[10][10][10][10]
c

Casos práticos de matrizes 2D em C

Iterar sobre um array 2D

A aplicação mais comum das matrizes 2D em C (ou matrizes mul­ti­di­men­si­o­nais) é a criação de es­tru­tu­ras de dados mul­ti­di­men­si­o­nais. No exemplo a seguir, uma matriz bi­di­men­si­o­nal é pre­en­chida al­ter­na­da­mente com zeros e uns para re­pre­sen­tar um tabuleiro de xadrez:

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

Matriz de strings

Um detalhe muito im­por­tante para o uso ha­bi­li­doso de matrizes: uma matriz é, na verdade, apenas um ponteiro para uma posição na memória, e o com­pi­la­dor C entende-a como tal. O índice es­pe­ci­fi­cado ao escrever ou ler campos in­di­vi­du­ais re­pre­senta, portanto, o des­lo­ca­mento ao longo da matriz em relação ao endereço base. O exemplo a seguir ilustra isso:

int cifras2[5] = {1, 2, 3, 4, 5}; 
printf("%d\n", *cifras2); 
// Resultado: 1 
printf("%d\n", *(cifras2 + 2)); 
// Resultado: 3
c

As strings ou cadeias são tratadas da mesma forma em C. Portanto, é possível iterar sobre uma cadeia como se fosse uma matriz. Isso pode ser visto no exemplo a seguir, em que três registos ar­ma­ze­na­dos numa matriz são exibidos caractere por caractere em maiús­cu­las. Para aceder aos ca­rac­te­res, utiliza-se o campo índice da matriz (colchetes):

#include <stdio.h> 
 
int main() { 
    char* frase[3]; 
    frase[0] = "¡Hola! Esta es la primera frase.\n"; 
    frase[1] = "Esta es la segunda frase.\n"; 
    frase[2] = "Y esta, la tercera.\n"; 
    printf("Frases originales:\n\n"); 
    for(int i = 0; i < 3; i++) { 
        printf("%s", frases[i]); 
    } 
    printf("\nFrases cambiadas:\n\n"); 
    for(int i = 0; i < 3; i++) { 
        int j = 0; 
        while(frases[i][j] != '\n') { 
            if(frases[i][j] >= 'a' && frases[i][j] <= 'z') { 
                printf("%c", frases[i][j] - 0x20); 
            } else { 
                printf("%c", frases[i][j]); 
            } 
            j++; 
        } 
        printf("\n"); 
    } 
} 
/* 
Resultado: 
Frases originales: 
 
¡Hola! Esta es la primera frase. 
Esta es la segunda frase. 
Y esta, la tercera. 
 
Frases cambiadas: 
 
¡HOLA! ESTA ES LA PRIMERA FRASE. 
ESTA ES LA SEGUNDA FRASE. 
Y ESTA, LA TERCERA. 
*/
c
Ir para o menu principal