Passagem por Referência - Como copiar vetor e matriz em C

Se você tiver notado bem nosso tutorial passado, sobre como passar vetores(arrays) e matrizes(vetores multidimensionais) em linguagemC, nós passamos vetores para funções, e essas alteravam os valores contidos nesses vetores.

Em um tutorial da seção sobre Funções em C, sobre variáveis locais, também dissemos que quando passamos variáveis para funções, seus valores não são alterados, pois as funções trabalhavam em cima de uma cópia da variável, e não na variável em sim, e dissemos que isso era chamado de passagem por valor.

Agora, em nossa apostila de C, vamos aprender um pouco sobre passagem por referência, em C, que é um tipo especial de passagem.

Vetor e Matriz: Passagem por referência

 A passagem de vetores e matrizes para funções é feita por referência. Ou seja, mandamos uma espécie de referência para as funções, em vez de mandar o próprio vetor ou uma cópia dele, como ocorre na passagem por valor.

O que é uma referência, em linguagem C?

É um endereço. Sim, um endereço na memória.
Lembra que falamos que, ao declarar variáveis, o C aloca um espaço em memória? Então, todo espaço da memória é identificado por um endereço.

É esse endereço que é passado para as funções, quando passamos vetores para funções.
As funções, quando recebem um vetor como argumento, passa a trabalhar no endereço que lhe foi passado. E o que tem nesse endereço?
Ora, o vetor que declaramos.

Logo, quando a função trabalhar com vetor, trabalha com o vetor real. Por isso os valores de um vetor podem ser alterados dentro de uma função.

Como copiar vetores e matrizes em C

Muitas vezes não queremos alterar nosso vetor.
Em muitos programas, precisamos extrair informação dos vetores, fazendo cálculos e modificações no mesmo, mas não queremos que esse vetor seja alterado.

O que fazer, então?
Copiar esse vetor/array/matriz e trabalhar com a cópia.
Porém, diferente das variáveis comuns, não podemos simplesmente igualar um vetor a outro.
Então, para copiar um vetor/array/matriz em Linguagem C, precisamos copiar elemento por elemento.

Vamos mostrar através de um exemplo como as funções realmente alteram os valores dos vetores, e como copiar um vetor.

Exemplo: Como copiar um vetor em C
Crie um programa que peça para o usuário 5 números, faça uma cópia desse idêntica desse vetor, outra cópia mas com os valores dobrados dos elementos. Por fim, mostre todos os 3 vetores: original, copiado e dobrado. Use funções.

Esse exemplo mostra bem como as funções alteram os valores dos vetores.
Primeiro criamos a função recebe, que irá receber os dados do usuário, que serão armazenados no vetor ‘original’.

Depois fazemos a função copiar, que recebe o vetor original e o vetor que vamos usar pra fazer a cópia. Note que temos que fazer a cópia elemento por elemento.

A função dobrar é bem parecida com a função que copia. A diferença é que a cópia é dobrada.
Como é necessário copiar elemento por elemento, para dobrar os valores de um vetor, é necessário multiplicar por 2 cada elemento também.

E por fim, uma função já velha conhecida nossa, que mostra os elementos de um vetor.

#include <stdio.h>
#define DIM 5
// 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 recebe(int original[])
{
    int count = 0;
 
    for(count = 0; count < DIM ; count++)
    {
        printf("Entre com o elemento %d: ", count+1);
        scanf("%d", &original[count]);
    }
}
 
void copiar(int copiado[], int original[])
{
    int count;
 
    for(count=0 ; count < DIM ; count++)
        copiado[count] = original[count];
}
 
void dobrar(int dobrado[], int original[])
{
    int count;
 
    for(count=0 ; count < DIM ; count++)
        dobrado[count] = 2 * original[count];
}
 
void exibir(int vet[])
{
    int count;
 
    for(count=0 ; count < DIM ; count++)
        printf("%3d ", vet[count]);
}
 
int main(void)
{ int original[DIM], copia[DIM], dobrado[DIM]; recebe(original); copiar(copia, original); dobrar(dobrado, original); printf("Vetor original: "); exibir(original); printf("\nVetor copiado : "); exibir(copia); printf("\nVetor dobrado : "); exibir(dobrado); return 0; }




Exemplo de código: Como copiar uma matriz em linguagem C

Faça o exemplo passado, mas agora o usuário vai inserir uma matriz 3x3.

Veja como se copia uma matriz em C:


#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 recebe(int original[][DIM])
{
    int linha,
        coluna;

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

void copiar(int copiado[][DIM], int original[][DIM])
{
    int linha,
        coluna;

    for(linha = 0 ; linha < DIM ; linha++)
        for(coluna = 0 ; coluna < DIM ; coluna++)
            copiado[linha][coluna] = original[linha][coluna];
}

void dobrar(int dobrado[][DIM], int original[][DIM])
{
    int linha,
        coluna;

    for(linha = 0 ; linha < DIM ; linha++)
        for(coluna = 0 ; coluna < DIM ; coluna++)
            dobrado[linha][coluna] = 2 * original[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 main(void)
{ int original[DIM][DIM], copia[DIM][DIM], dobrado[DIM][DIM]; recebe(original); copiar(copia, original); dobrar(dobrado, original); printf("Vetor original: \n"); exibir(original); printf("\nVetor copiado : \n"); exibir(copia); printf("\nVetor dobrado : \n"); exibir(dobrado);
    return 0;
}

11 comentários:

Anônimo disse...

kkkkkkkkkkkkkkkkkkk voces do C Prograssivo deviam ter falado antes isso, d q o vetor/matriz tem seu valor alterado na função..........

Fiquei q nem um doido no tutorial passado tentado resolver aquele ultimo exemplo rsrsrs........

Agora eu entendi kkkkkk
Obrigado C Progressivo :D

Anônimo disse...

Belo Poste, ajudou-me bastante

Amanda disse...

Seu site é ótimo. Muito obrigada por explicar de um jeito tão didático e com tantos exemplos, Me ajudou muito. Obrigada!

andreia fernandes disse...

Eu quero copiar um vetor de valores aleatórios, para isso eu usei a função recebe.
Porem na hora de mostrar o vetor aparece outros números. Não entendi o porque..
O código:


#include
#include
#include
#define TAM 50

int recebe(){
int vet[TAM];
int i=0,cont=1;

printf("Gerando vetor aleatorio = \n\n");
srand(time(NULL));

for(i=0; i<TAM ; i++){
vet[i] = rand()%TAM;
}

for(i=0;i<TAM;i++){
printf("N[%d] = %d\n",cont,vet[i]);
cont++;
}
return vet[i];
}

int copiar(int copiado[], int recebe[]){
int cont;

for(cont=0 ; cont < TAM ; cont++){
copiado[cont] = recebe[cont];
}
return copiado[cont];
}

void exibir(int vet[]){
int count;

for(count=0 ; count < TAM ; count++){
printf("%d\t", vet[count]);
printf("\n");
}
}

int main(void){
int original[TAM], copia[TAM];

recebe();
copiar(copia, original);

printf("\t\tVetor original:\n ");
exibir(original);
printf("\n");
printf("\t\tVetor copiado :\n ");
exibir(copia);

return 0;
}

Anônimo disse...

Não entendi bem o que o exemplo acima tentou nos mostrar realmente?
Onde no texto diz: Passagem por referência(endereço de memória), não vi nada de ponteiros, e sim por cópia.
??

Anônimo disse...

Andreia

Na função recebe() você está populando o array "vet" criado na própria função "recebe" e na hora de exibir você está passando o "original" e este não foi populado, dessa forma você está exibindo lixo da memória e não o array.

Deveria ser desta forma:

//function que recebe os valores
int recebe(int original[]) {

int i = 0,
cont = 1;

printf("Gerando vetor aleatorio = \n\n");
srand(time(NULL));

for (i = 0; i < TAM; i++) {
original[i] = rand() % TAM;
}

for (i = 0; i < TAM; i++) {
printf("N[%d] = %d\n", cont, original[i]);
cont++;
}

return original;
}


//chamada a function recebe passando o array original
recebe(original);

Samir disse...

Por que que na função DOBRAR, quando matriz, deve-se declarar o número de colunas?
void dobrar(int dobrado[][DIM], int original[][DIM])

André de Souza disse...

muito bom.

mas é som com o vetor que passa a referencia sem colocar "&" antes não é?

André de Souza disse...

8- Ao se utilizar um vetor como parâmetro para uma função que informação está sendo passada à função?


a. Uma cópia de todos elementos do vetor
b. Uma cópia do primeiro elemento do vetor
c. O endereço do primeiro elemento do vetor
d. O endereço de todos os elementos do vetor
e. Nenhuma das opções anteriores



a resposta correta foi a letra c. como assim? so se cada elemento do vetor funcionar como ponteiro... o 1 apontada para o 2 e assim vai ... ta correto?

Alan disse...

não entendi qual a utilidade do vetor copiado, sendo que da para dobrar sem usar o vetor copia .

Anônimo disse...

Ola boa noite!
Estou tendo problemas para fazer um programa que copia uma matriz 3x3 para um vetor de 9 posições, na hora de imprimir, esta sendo mostrado numeros aleatorios, mas nao os mesmos que preenchi a matriz. Alguem pode me ajudar?
Esta aqui o codigo:

#include


void preencher(int m[][3]){

int i,j;

for(i=0;i<3;i++){
for(j=0;j<3;j++){

printf("Linha %d, Coluna %d:", i+1, j+1);
scanf("%d", &m[i][j]);
}
}
}
void mostrar(int m[][3]){

int i,j;

for(i=0;i<3;i++){
for(j=0;j<3;j++){

printf("%d", m[i][j]);

}printf("\n");
}
}

void copiar(int v[], int m[][3]){

int a=0, i,j;

for(i=0;i<3;i++){
for(j=0;j<3;j++){

v[a]=m[i][j];

printf("%d ", v[a]);
a++;

}
}
}




main(){

int m[3][3], v[9];
preencher(m);
mostrar(m);
copiar(m,v);
}

Gostou desse tutorial de C?
Sabia que o acervo do portal C Progressivo é o mesmo, ou maior que, de um livro ou curso presencial?
E o melhor: totalmente gratuito.

Mas para nosso projeto se manter é preciso divulgação.
Para isso, basta curtir nossa página no Facebook e/ou clicar no botão +1 do Google.
Contamos e precisamos de seu apoio.