Enviar um café pro programador

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

Variáveis apontadas - A Passagem por Referência em C

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.

Obtendo o valor apontado pelo ponteiro: *

Para obtermos o valor da variável na qual o ponteiro aponta, devemos colocar um asterisco - * - antes do ponteiro, assim, o ponteiro irá mostrar o valor da variável (a variável que ele aponta), e não mais seu endereço.

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:

Anônimo disse...

Achei um pouco confuso esta página, no que diz respeito a troca de valores das variáveis através do uso dos ponteiros.

Alucian de Souza disse...

No trecho:

Agora vamos criar um ponteiro ‘ptr_int’ e fazê-lo apontar para ‘numero’:
int ptr_int = &numero;

Na linha onde se encontra o código:
int ptr_int = &numero;

Está errado, o correto é:

int *ptr_int = &numero;

Anônimo disse...

verdade

Unknown disse...

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!

Anônimo disse...

Alucian de Souza, o treco int ptr_int = &numero; Não está errado, a sua resposta sim está errada, pois se declarasse int *ptr_int = &numero; 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 = &numero; // ptr_int salve o endereço da variavel numero.

Anônimo disse...

Na verdade:

int *ponteiro = &a;

int *ponteiro;
ponteiro = &a;

Tanto faz atribuir quando declarar ou separado mas deve estar nesse formato :/

Eu disse...

Show de bola!

José disse...

Incrível. Parabéns!!