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.
- Como obter certificado de programação em C
- Download de nossa apostila: Apostila de C
Vetor e Matriz: Passagem por referência
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;
}
14 comentários:
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
Belo Poste, ajudou-me bastante
Seu site é ótimo. Muito obrigada por explicar de um jeito tão didático e com tantos exemplos, Me ajudou muito. Obrigada!
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;
}
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.
??
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);
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])
muito bom.
mas é som com o vetor que passa a referencia sem colocar "&" antes não é?
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?
onde esta a passagem por referencia ai??
não entendi qual a utilidade do vetor copiado, sendo que da para dobrar sem usar o vetor copia .
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);
}
Muito bom!!!
acrescentado do tripo também mando pra quem precisar:
#include
#include
#define TRI 10
void recebe(int original[])
{
int count = 0;
for(count = 0; count < TRI ; 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 < TRI ; count++)
copiado[count] = original[count];
}
void dobrar(int dobrado[], int original[])
{
int count;
for(count=0 ; count < TRI ; count++)
dobrado[count] = 2 * original[count];
}
void triplicado(int triplica[], int original[])
{
int count;
for(count=0 ; count < TRI; count++)
triplica[count] = (3 )* (original[count]);
}
void exibir(int vet[])
{
int count;
for(count=0 ; count < TRI ; count++)
printf("%3d ", vet[count]);
}
int main()
{
int original[TRI],
copia[TRI],
dobrado[TRI],
triplica[TRI];
recebe(original);
copiar(copia, original);
dobrar(dobrado, original);
triplicado(triplica, original);
printf("Vetor original: ");
exibir(original);
printf("\nVetor copiado : ");
exibir(copiar);
printf("\nVetor dobrado : ");
exibir(dobrado);
printf("\nVetor triplicado : ");
exibir(triplica);
return 0;
}
Postar um comentário