Já vimos como declarar e inicializar ponteiros em C, bem
como estudamos a teoria por trás dos endereços de memória e blocos de memórias, vamos mostrar agora em nossa apostila a maior utilidade dos ponteiros, que é trabalhar com os valores das variáveis
para qual eles apontam, e alterar seu valor.
- Leia esse conteúdo Offline: Apostila C Progressivo
Obtendo o valor apontado pelo ponteiro: *
Por exemplo, vamos supor que tenhamos declarado a
variável inteira ‘numero’:
int numero = 1;
Agora vamos criar um ponteiro ‘ptr_int’ e fazê-lo apontar para ‘numero’:
int *ptr_int = №
Pronto, agora ptr_int
aponta para numero.
Para saber o valor de numero
através do ponteiro, usamos: *ptr_int
Veja bem:
ptr_int -> armazena o endereço da variável numero
*ptr_int -> se refere ao VALOR da variável, ou seja,
ao valor da variável numero.
Exemplo de código: Mostrando o valor das variáveis apontadas por ponteiros
Crie um programa em C que peça ao usuário três números
inteiros e armazene em três variáveis inteiras através do uso de um ponteiro.
Após o usuário inserir cada número, mostre o número
exibido, porém mostre através do ponteiro.
Desde o início de nosso curso de C, quando ensinamos como
obter dados a partir do usuário, através da função scanf(), nós vínhamos usando o operador & dentro dessa função
para que o dado inserido pelo usuário fosse armazenado em determinada posição
de memória.
Aqui, vamos criar três inteiros e um ponteiro de inteiro,
que irá apontar para cada uma dessas variáveis. Usaremos o ponteiro dentro da
scanf(uma vez que ele guarda o endereço da variável pra onde ele aponta) e o
asterisco, para mostrar o valor da variável que é apontada por ele.
#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 !int main(void){ int int1, int2, int3; int *ptr_int = &int1; printf("Inteiro 1: "); scanf("%d", ptr_int); printf("Numero inserido: %d\n", *ptr_int); ptr_int = &int2; printf("Inteiro 2: "); scanf("%d", ptr_int); printf("Numero inserido: %d\n", *ptr_int); ptr_int = &int3; printf("Inteiro 3: "); scanf("%d", ptr_int); printf("Numero inserido: %d\n", *ptr_int);
return 0;}
O que é e como fazer a Passagem por referência em C
Para passarmos uma variável para uma função e fazer com
que ela seja alterada, precisamos passar a referência dessa variável, em vez de
seu valor.
Até o momento, vínhamos passando somente o valor das
variáveis.
Conforme explicamos, quando passamos um valor, a função
copia esse valor e trabalhar somente em cima da cópia dessa variável, e não na
variável em si. Por isso nossas variáveis nunca eram alteradas quando passadas
para funções.
Porém, é muito importante e útil que algumas funções alterem valores de variáveis.
Para fazer isso, usaremos um artifício chamado Passagem por
Referência.
Por referência entenda endereço, um local. No caso, em
vez de passar o valor da variável, na
passagem por referência vamos passar o endereço da variável para a função.
Para fazer isso, basta colocar o operador & antes do
argumento que vamos enviar, e colocar um asterisco * no parâmetro da função, no
seu cabeçalho de declaração, para dizer a função que ela deve esperar um
endereço de memória, e não um valor.
Sim, parece confuso e difícil entender assim de cara, mas
vamos mostrar dois exemplos em que usaremos a passagem por referência.
Exemplo de código:
Passagem por referência em C
Crie um programa que recebe um inteiro e dobra seu valor.
Para que uma função altere o valor de uma variável, é
necessário que essa função atue no endereço de memória, e não na copilar do
valor. Para isso, temos que passar o endereço da variável para a função (usando
&), e a função tem que ser declarada de modo a esperar um ponteiro (usando
*).
Dentro da função, devemos trabalhar com o valor na qual
aquele ponteiro aponta.
Ou seja, se o ponteiro tiver nome ‘ptr’, devemos trabalhar com o valor ‘*ptr’.
Veja como ficou nosso código C:
#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 ! void dobra(int *num) { (*num) = (*num) * 2; }int main(void){ int num; printf("Insira um numero: "); scanf("%d", &num); dobra(&num); printf("O dobro dele eh: %d\n", num);
return 0;}
Exemplo de código:
Trocar o valor de dois números em C
Crie um programa em C que peça ao usuário o valor de uma
variável x e depois de uma y.
Crie uma função que inverta esses valores através do uso
de ponteiros.
Mais uma vez, declaramos uma função que irá receber dois
ENDEREÇOS de memória, ou seja, irá receber dois ponteiros. Esses ponteiros têm
os locais onde as variáveis x e y foram armazenadas.
Para alterar esses valores, vamos trabalhar com (*x) e
(*y).
Para fazer duas variáveis trocarem de valores entre si,
iremos precisar de uma variável temporária.
Primeiro guardamos o valor de x na variável temporária
(vamos precisar depois).
Em seguida, fazemos x receber o valor de y.
Agora é y que tem que receber o valor de x.
Mas x mudou de valor, lembra?
Ou seja, precisamos pegar o antigo valor de x.
Foi por isso que guardamos esse antigo valor de x na variável temporária.
Logo, agora é só fazer com que y pegue o valor da
variável temporária, e teremos os valores invertidos.
#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 ! void troca(int *x, int *y) { int tmp; tmp = *x; *x = *y; *y = tmp; }int main(void){ int x, y; printf("Insira o numero x: "); scanf("%d", &x); printf("Insira o numero y: "); scanf("%d", &y); troca(&x, &y); printf("Agora x=%d e y=%d\n", x, y);
return 0;}
8 comentários:
Achei um pouco confuso esta página, no que diz respeito a troca de valores das variáveis através do uso dos ponteiros.
No trecho:
Agora vamos criar um ponteiro ‘ptr_int’ e fazê-lo apontar para ‘numero’:
int ptr_int = №
Na linha onde se encontra o código:
int ptr_int = №
Está errado, o correto é:
int *ptr_int = №
verdade
Gostei muito da explicação, estou estudando comunicação serial e algumas variáveis trabalham com está idéias de ponteiro. Está bem difícil no primeiro contato, mas a cada nova explicação fica mais claro. OBRIGADO PELA AJUDA!
Alucian de Souza, o treco int ptr_int = № Não está errado, a sua resposta sim está errada, pois se declarasse int *ptr_int = № estaria dizendo para o valor do ponteiro deveria apontar para um endereço e isto daria erro ao compilar. então resumindo o certo é
int_ptr = № // ptr_int salve o endereço da variavel numero.
Na verdade:
int *ponteiro = &a;
int *ponteiro;
ponteiro = &a;
Tanto faz atribuir quando declarar ou separado mas deve estar nesse formato :/
Show de bola!
Incrível. Parabéns!!
Postar um comentário