Aula 24 – Ponteiro e protótipo – Algoritmo em C

Aula 24 – Ponteiro e protótipo – Algoritmo em C

Aula 24 - Ponteiro e protótipo - Algoritmo em C - Nível intermediário

Ponteiro e protótipos de funções

Antes de prosseguir com vetores e strings, vamos ver ponteiro e protótipo de funções.

Protótipo

Se dentro de uma função qualquer ocorre uma chamada a uma outra função que está declarada depois dela, ocorre um erro, pois para essa função que chamou a outra declarada depois, é como se a função chamada não existisse, pois não enxerga o que está depois dela.
Protótipo serve para contornar esses problemas de ordem de declaração de funções, de forma que todo o código saiba todas as funções existentes nele.

No código logo abaixo, como a main( ) foi declarada depois da função soma, ela enxerga a função soma, não ocorrendo erro.

#include  <stdio.h>/*Instrução de pré-processamento, habilita nosso programa a usar essa biblioteca de entradas e saídas, possui funções como scanf e printf*/
#include  <stdlib.h>/*Instrução de pré-processamento, habilita nosso programa a usar essa biblioteca, para poder usar o system("PAUSE"); */
#include  <locale.h>/*Instrução de pré-processamento, habilita nosso programa a usar essa biblioteca, para usar caracteres como: ç, Ç, Â ,â etc. No printf( )*/

int soma(int numero1, int numero2)
{
  return numero1 + numero2;
}

int main(void){
  int s, num1, num2;
  /*Ativa a configuração da biblioteca locale.h para português*/
  setlocale(LC_ALL, "Portuguese"); //Ativa a configuração da biblioteca locale.h para português
  num1 = 3;
  num2 = 5;
  s = soma(num1, num2);
  printf("Soma é: %d", s);
}

Se for ao contrário, como mostrado logo abaixo, ocorrerá um erro, pois a main( ) não enxergará função soma( ).

#include <stdlib.h>/* Instrução de pré-processamento, habilita nosso programa a usar essa biblioteca de entradas e saídas, possui funções como scanf e printf*/
#include <stdlib.h>/*Instrução de pré-processamento, habilita nosso programa a usar essa biblioteca, para poder usar o system("PAUSE"); */
#include <locale.h>/*Instrução de pré-processamento, habilita nosso programa a usar essa biblioteca, para usar caracteres como: ç, Ç, Â ,â etc. No printf( )*/

int main(void){
  int s, num1, num2;
  /*Ativa a configuração da biblioteca locale.h para português*/
  setlocale(LC_ALL, "Portuguese"); //Ativa a configuração da biblioteca locale.h para português
  num1 = 3;
  num2 = 5;
  s = soma(num1, num2);
  printf("Soma é: %d", s);
}

int soma(int numero1, int numero2) { 
   return numero1 + numero2; 
}

Para que o código funcione, mesmo com a main( ) sendo implementada antes, teremos que usar o protótipo da função soma( ) como mostrado abaixo.

#include <stdlib.h>/*Instrução de pré-processamento, habilita nosso programa a usar essa biblioteca de entradas e saídas, possui funções como scanf e printf*/
#include <stdlib.h>/*Instrução de pré-processamento, habilita nosso programa a usar essa biblioteca, para poder usar o system("PAUSE"); */
#include <locale.h>/*Instrução de pré-processamento, habilita nosso programa a usar essa biblioteca, para usar caracteres como: ç, Ç, Â ,â etc. No printf( )*/

//Protótipo da função soma ( )
int soma(int numero1, int numero2);
int main(void){
  int s, num1, num2;
  /*Ativa a configuração da biblioteca locale.h para português*/
  setlocale(LC_ALL, "Portuguese"); //Ativa a configuração da biblioteca locale.h para português
  num1 = 3;
  num2 = 5;
  s = soma(num1, num2);
  printf("Soma é: %d", s);
}

int soma(int numero1, int numero2) { 
    return numero1 + numero2; 
}

Ponteiros

Um ponteiro é uma variável capaz de armazenar um endereço de memória que pode ser de uma variável, de um vetor, de uma struct, de uma string…

#include <stdlib.h>/*Instrução de pré-processamento, habilita nosso programa a usar essa biblioteca de entradas e saídas, possui funções como scanf e printf*/
void main()
{
    int n1, n2, n3;
    int *ptr;  // declara um ponteiro para um inteiro
    n1 = 5;
    n2 = 2;
    n3 = 3;
    ptr = &n1;
    printf("Endereco de n1: %p", &n1);
    printf("\nEndereco de n2: %p", &n2);
    printf("\nEndereco de n3: %p", &n3);
    printf("\nEndereco de ptr: %p", &ptr);
    printf("\nConteudo de ptr: %p \nConteudo da var que ptr aponta: %d\n", ptr, *ptr); //O %p  (Ponteiro) exibe o endereço de memória em hexadecimal.
    printf("\nn1: %d\nn2: %d\nn3: %d\n\n\n", n1, n2, n3);
}

Outro código com duas funções, usando ponteiros.

#include <stdio.h> 

//Protótipo
void somaUmAosDoisNumeros(int* numero1, int* numero2);
int main(void){
    int num1, num2;
    num1 = 3;
    num2 = 5;
    printf("Valor de num1: %d\n", num1);
    printf("Endereço de num1: %p\n\n", &num1);
    printf("Valor de num2: %d\n", num2);
    printf("Endereço de num2: %p\n\n", &num2);
    somaUmAosDoisNumeros(&num1, &num2);
    printf("num1 agora tem: %d\n\n", num1);
    printf("num2 agora tem: %d\n\n\n", num2);
    return 0;
}

void somaUmAosDoisNumeros(int *numero1, int *numero2)
{
  *numero1 = *numero1 + 1;
  *numero2 = *numero2 + 1;
   printf("\nendereco de numero1: %p", &numero1);
   printf("numero1 armazena: %p", numero1);
   printf("\nendereco de numero2: %p\n", &numero2);
   printf("numero2 armazena: %p", numero2);
}

Depois das linha:

*numero1 = *numero1 + 1;
*numero2 = *numero2 + 1;

A memória fica assim:

Link encurtado para download dos códigos

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *