sexta-feira, 24 de junho de 2011

Arrays bidimensionais

Olá pessoal,

hoje vamos tentar trabalhar um pouco com arrays bidimensionais, mais especificamente em como passá-los como parâmetros de funções.

Para isso vamos escrever duas funções, uma para imprimir um array e outra para preencher.

No exemplo vamos utilizar um array de 3 por 4.


void ImprimeMatriz(int matriz[][4], int linha)
{
    int c_linha; //conta linhas
    int c_coluna;//conta colunas
    int coluna = 4;
    for(c_linha = 0; c_linha < linha; c_linha++)
    {
        printf("\n");
        for(c_coluna = 0; c_coluna < coluna; c_coluna++)
            printf("%d ", matriz[c_linha][c_coluna]);
    }

}

void PreencheMatriz(int matriz[][4], int linha)
{
    int contador = 0;
    int c_linha; //conta linhas
    int c_coluna;//conta colunas
    int coluna = 4;
    for(c_linha = 0; c_linha < linha; c_linha++)
    {
        for(c_coluna = 0; c_coluna < coluna; c_coluna++)
            matriz[c_linha][c_coluna] = contador++;
    }
}

Veja que, temos que passar o tamanho da linha como parâmetro da matriz, vejas as assinaturas: void PreencheMatriz(int matriz[][4], int linha) e void ImprimeMatriz(int matriz[][4], int linha)

Bom, isso porque na verdade é passado o endereço do array, e o C precisa saber até onde ele pode ir na linha.

Outra possibilidade é utilizarmos aritmética de ponteiros, na verdade, um array é um conjunto contínua na memória, assim por exemplo, se o endereço inicial é 10, e um inteiro ocupar 2 bytes temos que o primeiro elemento está no endereço 10, o segundo no endereço 12, o terceiro no 14.... Isso deve ser bem observado, por exemplo para chegar no endereço 12, se nosso endereço base é 10, fazemos a seguinte operação com nosso ponteiro: ponteiro +1, ou seja, o + 1 diz que vamos para o próximo endereço, com o passo de acordo com nosso tipo, que no exemplo é int e assumimos que ele é de 2 bytes. Vejamos abaixo uma função que vai fazer esse tipo de operação para imprimir nosso array:

void ImprimeMatrizPonteiros(int * matriz, int tamanho)
{
    int cont = 0;
    for (cont = 0; cont < tamanho; cont ++)
    {
        printf("% d", *(matriz + cont));
    }
}

Nosso método main:

int main()
{
    int matriz[3][4];
    PreencheMatriz(matriz,3);
    ImprimeMatriz(matriz,3);
    printf("\nVamos usar apenas ponteiros:\n");
    ImprimeMatrizPonteiros(matriz[0],12);


    return 0;
}

que irá reproduzir a seguinte saída:

Nenhum comentário:

Postar um comentário