Aula 24 – Ponteiro e protótipo – Algoritmo em C
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: