Enviar um café pro programador

Pode me ajudar a transformar cafeína em código?

Como passar vetores, ou arrays, e Matrizes (vetores multidimensionais) para funções em C

Agora que você já domina bem o uso das funções e dos vetores em C, vamos unir esses dois conhecimentos e ensinar você como passar vetores (unidimensionais, multidimensionais, matriz), ou arrays, para funções.

Como o curso C Progressivo vai mostrar, para programar em C é bem comum passar vetores, e outras estruturas de dados, para funções.

Como você viu nos exemplos passados de nossa apostila de C, dá um certo trabalhinho lidar com vetores.
E para o código não ficar confuso e grande na main(), costumamos colocar os códigos que operam vetores em funções.

Como passar um vetor parar uma função em C

Embora tenhamos batido na tecla sobre o fato de vetores serem um conjunto de variáveis, como outras quaisquer, existem alguns detalhes que precisamos saber na hora de passar os vetores para as funções, principalmente no cabeçalho de declaração da função.
Mas não precisa entrar em desespero, pois os detalhes são para facilitar nossa vida.

No caso de um vetor unidimensional (vetor comum, de uma dimensão), precisamos colocar apenas o par de colchetes – [ ] -após o nome da variável, e vazio.
Isso mesmo, vazio. Não importa se seu vetor tem 1, 10 ou 1 milhão de elementos.
As funções em C apenas precisam saber qual o tipo da variável  e se é um vetor.

Então, a sintaxe de uma função que recebe um vetor é:
retorno nomeDaFuncao( tipo vetor[] , ...)

Por exemplo, uma função que recebe um vetor de inteiros e retorna um inteiro:
int funcao( int numeros[] )

Uma função sem retorno que recebe um vetor/array de floats:
void funcao2( float decimais[] )

O outro detalhe vem na hora de invocar a função e passar o vetor como argumento.
Para fazer isso basta colocar o nome do vetor, não precisa dos pares de colchetes [] nem da dimensão do vetor.

Por exemplo, para passar vetores as funções que demos como exemplo:
funcao(numeros);
funcao2(numeros):

Exemplo: Programa que calcula média aritmética, com vetor e função
Crie um programa em C que peça 5 números ao usuário, armazene esses dados em um vetor, passe esse vetor para uma função que retorna o valor da média dos números desse vetor.

#include <stdio.h>
// Curso C Progressivo: www.cprogessivo.net
// O melhor curso de C! Online e gratuito !
// Artigos, apostilas, tutoriais e vídeo-aulas sobre
// a linguagem de programação C !
 
float media(float numeros[], int n)
{
    int count;
    float media=0.0;
 
    for(count=0 ; count<n ; count++)
        media += numeros[count];
 
    return (media/n);
}
 
int main(void)
{ float numeros[5]; int count; for(count=0 ; count < 5 ; count++) { printf("Entre com o numero %d: ", count+1); scanf("%f", &numeros[count]); } printf("A media desses numeros e: %.2f\n", media(numeros, 5));
    return 0;
}


Como passar matrizes (vetores multidimensionais) para funções

Este tópico está separado do anterior, pois aqui temos mais um detalhe que precisamos aprender sobre a passagem de matrizes para funções.

Sabemos que matrizes multidimensionais são aqueles que possuem duas ou mais dimensões.
Vimos também em nosso tutorial sobre matrizes (ou vetoresmultidimensionais) em C, que cada dimensão da matriz exige um paz de colchetes [ ].

Pois bem, o detalhe para passar matriz para as funções é que o primeiro par de colchetes pode sempre ir vazio, e os demais preenchidos.

Por exemplo, vamos supor que você criou um jogo da velha, que é uma matriz 3x3, e uma função que checa se algum jogador ganhou o jogo completando alguma linha.

Essa função teria o seguinte cabeçalho:
int checaLinha( int matriz[][3] )

Ou seja, não precisamos especificar o número de linhas que a matriz tem, mas somente o número de colunas.


Exemplo de código: Como preencher, exibir uma matriz e seu traço, passando a matriz para uma função em C

Crie um programa em C que peça para o usuário preencher uma matriz 3x3, que exiba ela e o valor de seu traço em seguida. Use funções para preencher a matriz, exibir e calcular o traço.

Esse aplicativo em C já foi totalmente resolvido como exemplos, no artigo passado de nossa apostila de C.

O que vamos fazer aqui é criar três funções: uma para preencher a matriz, outra pra exibir e uma que calcula o traço.

Note como a nossa função main() ficou bem limpa.
Esse é o ideal, é padrão C Progressivo!

include <stdio.h>
#define DIM 3
// Curso C Progressivo: www.cprogessivo.net
// O melhor curso de C, Online e gratuito !
// Artigos, apostilas, tutoriais e vídeo-aulas sobre
// a linguagem de programação C !

void preencher(int matriz[][DIM])
{
    int linha,
        coluna;

    for(linha=0 ; linha < DIM ; linha++)
        for(coluna=0 ; coluna < DIM ; coluna++)
        {
            printf("Entre com o elemento matriz[%d][%d]: ", linha+1, coluna+1);
            scanf("%d", &matriz[linha][coluna]);
        }
}

void exibir(int matriz[][DIM])
{
    int linha,
        coluna;

    for(linha=0 ; linha < DIM ; linha++)
    {
        for(coluna=0 ; coluna < DIM ; coluna++)
            printf("%3d ", matriz[linha][coluna]);

        printf("\n");
    }

}

int traco(int matriz[][DIM])
{
    int count,
        traco=0;

    for(count=0 ; count < DIM ; count++)
        traco += matriz[count][count];

    return traco;
}

int main(void)
{ int matriz[DIM][DIM]; preencher(matriz); exibir(matriz); printf("\nTraco da matriz: %d\n", traco(matriz));

    return 0;
}

15 comentários:

Anônimo disse...

Legal, foi muito útil. Ótimo site, sempre uso para consultas.

Anônimo disse...

Legal o blog, estou aprendendo muito.
Tem algum jeito de eu passar uma matriz para uma função permitindo que o usuário determine as linhas e colunas da matriz?

Unknown disse...

Eu criei uma estrturada onde vc define a qde de linhas e colunas

#include

int main(){
int DIM;
printf("Digite o tamanho da matriz que deseja criar: "); scanf("%d",&DIM);
int matriz[DIM][DIM];
int linha, coluna;
for(linha = 0 ; linha < DIM ; linha++)
for(coluna = 0 ; coluna < DIM ; coluna++)
{
printf("Elemento [%d][%d]: ", linha+1, coluna+1);
scanf("%d", &matriz[linha][coluna]);
}
for(linha = 0 ; linha < DIM ; linha++)
{
for(coluna = 0 ; coluna < DIM ; coluna++)
printf("%4d", matriz[linha][coluna]);

printf("\n");
}
system("pause");
return 0;
}

Unknown disse...

Bom dia C progressivo.
Minha dúvida é o seguinte: é regra ter que por colchetes vazio [] para linha e por um tamanho para a coluna?
Porque caso eu tenha que fazer um algoritmo que o usuário determine a dimensão da matriz, logo, a dimensão que essa matriz recebeu é local (não sei nem se estou me expressando corretamente.), no seu caso, você criou uma constante, caso eu não venha criar uma constante, comoi eu posso resolver esse problema? Att.

Anônimo disse...

como eu faço para retornar um vetor de uma função para a função main

Anônimo disse...

O que eu acho:

Se um vetor é passado para uma função e alterado dentro dela
e essas alterações são mantidas, para que retornar ele de uma
função ?

Se for para atribuir o conteúdo dele à outro vetor basta após
o uso da função e copiar com strcpy().

Unknown disse...

Muito bem explicado como sempre, parabéns mais uma vez ao site!!
Agora, só um pequeno detalhe:
No lugar de "matriz exige um paz de colchetes" não seria "matriz exige um PAR de colchetes"?
Mais uma vez, muito obrigado pelo ótimo curso :)

orcrux disse...

Cara, se vc tiver passado o vetor por ponteiro e tiver usando sua funçao no vetor, so usar ele normalmente, pq vc so passo o endereço da memoria nao os valores do vetor, ent e so usar normal na linha de baixo.

orcrux disse...

thiaguinhopier@yahoo.com.br , o que vc procura ira encontrar em alocaçao dinamica, ja dependendo do seu problema e do dizer pra funçao vai usar uma matriz muito grande e usar so parte dele ;D


#so nao deixando o povo na vacuo. ashushu

lalo disse...

Estou achando ótimas todas as suas postagens no blog sobre c, muito boas mesmo!
Vocês estão me ajudando muito.

muito obrigado
Nicolas


ps. uma na página onde estou postando este comentário, no link http://www.cprogressivo.net/2013/03/Como-passar-vetores-arrays-e-Matrizes-vetores-multidimensionais-para-funcoes-emC.html
abaixo do título Como passar matrizes (vetores multidimensionais) para funções, segundo parágrafo, segunda linha desse parágrafo, tem uma letrinha trocada, diz: "paz de colchetes[]", deveria dizer "par de colchetes[]". Esta é toda a contribuição que posso dar por hora... um pequeno detalhe, que ajude neste grandioso empreendimento de ensino.

Rayller disse...

Cara, eu tava indo muito bem, mas essa parte de vetores e matrizes em funções me bugou completamente. Se possível, explica detalhado os códigos, pra ficar mais fácil de entender. Eu paralisei nesse código:
for(count=0 ; count<n ; count++)
media += numeros[count];

Me deu a tela azul do da morte eu to travado nela.

Lucas de Lima disse...

Muito bom!

Let's Learn disse...

Gostaria que as dimensões da matriz fossem definidas pelo usuário no inicio do programa. Somente consegui fazer o programa rodar definindo o numero de linhas e fixando o numero de coluna através do #define.
Alguém sabe me explicar como fazer isto?



#include
#include
#define ROW 3
#define WIDTH 3

int createMatrix (int matrixImput [][WIDTH], int rowsInput, int widthInput );

int main()
{
setlocale(LC_ALL, "Portuguese");
int row, width;

// printf("\t Entre com as dimensões da matrix: [ ][ ]");
// printf("\n\t Quantidade de linhas: ");
// scanf("%d", &row);
row = ROW;
width = WIDTH;
// printf("\t Quantidade de colunas: ");
// scanf("%d", &width);

int matrix[row][width];
createMatrix (matrix, row, width );
printMatrix (matrix, row, width );
}


int createMatrix (int matrix [][WIDTH], int rowsInput, int widthInput )
{
int counter_row, counter_width;

for(counter_row = 0; counter_row < rowsInput; counter_row++)
{
printf("\n");
for (counter_width = 0; counter_width < widthInput; counter_width++)
{
printf("Entre com o elemento [%d][%d]: ", counter_row + 1, counter_width + 1 );
scanf("%d", &matrix[counter_row][counter_width]);
}
}

}

int printMatrix (int matrix [][WIDTH], int rowsInput, int widthInput)
{
int counter_row, counter_width, traco = 0;

for(counter_row = 0; counter_row < rowsInput; counter_row++)
{
printf("\n\t");
traco += matrix[counter_row][counter_row];
for (counter_width = 0; counter_width < widthInput; counter_width++)
printf("%4d ", matrix[counter_row][counter_width]);
}
printf("\n");

printf("\n \tO traço da Matrix é: %4d \n", traco);
}

Anônimo disse...

Boa tarde, como passo de uma função struct para uma matriz de inteiros no programa Scilab?

Vinnicius disse...

O exemplo funcionou. MAS quando eu tento passar um array do tipo de uma classe que eu criei, por exemplo classe "Produto" o compilador não deixa enviar o objeto declarado como parametro. Ele diz que não é possível converter Produto* para Produto(*)[100], por exemplo. Não entendi essa "conversão" necessária. Procurei por tudo, dei até passos para trás no estudo pra tentar entender, mas eu estou quase desistindo. Todos os tutoriais falam a mesma coisa, mas pra mim simplesmente NÃO FUNCIONA.