Passagem de parâmetros - Parte 2

Na página "Passagem de Parâmetros - Parte 1", vimos que podemos usar ponteiros para acessar diretamente uma posição de memória a partir de seu endereço. Esse recurso é bastante útil para lidarmos com passagem de parâmetros em funções, já que:

  1. variáveis de tipos primitivos são passadas por cópia, com duração temporária na stack de memória;
  2. vetores e matrizes são passados como ponteiros para as funções, que podem acessar diretamente suas posições na memória;

🏹 Ponteiros e funções

Para receber um ponteiro, a função deve conter essa declaração em sua assinatura:

#include<stdio.h>
#include<stdlib.h>

void receberPonteiro(float *variavel){
    *variavel = 10.0;
}

int main(void){
    float nota1 = 5.0;
    receberPonteiro(&nota1); // usar & antes para passar o endereço de memória
    printf("Valor: %f", nota1);
}

Alternativamente, o código poderia ser implementado da seguinte forma;

#include<stdio.h>
#include<stdlib.h>

void receberPonteiro(float *variavel){
    *variavel = 10.0;
}

int main(void){
    float nota1 = 5.0;
    float *nota1Ptr = &nota1;
    receberPonteiro(nota1Ptr); 
    printf("Valor: %f", nota1);
}

Um exemplo bem comum que encontramos ao estudarmos o uso de ponteiros consiste na troca de valores entre duas variáveis. Observe a implementação a seguir:

#include<stdio.h>
#include<stdlib.h>

void trocar(int *x, int *y){
    int aux = *x;
    *x = *y;
    *y = aux;
}

int main(){
    int a = 10, b = 20;
    printf("A: %d - B: %d\n", a, b);

    trocar(&a,&b);
    
    printf("A: %d - B: %d\n", a, b);
    return 0;
}