Fala Galera!
Hoje vamos falar um pouco sobre Ponteiros, também chamados de apontador.
Ponteiro em programação é uma espécie de dados que direciona para um endereço de um objeto em memória (RAM). Caso ele aponte para lugar nenhum ou para algum "local errado", seja fora da área de memória reservada ou simplesmente para uma área que não exista, o valor será NULL.
Ponteiros são amplamente utilizados em linguagem C.
#include <stdlib.h>
void soma(int numero) {
numero+=20;
}
void somaPonteiros(int* numero) {
*numero += 20;
}
int main()
{
int a;
int *b;
b = malloc (a * sizeof(int));
a = 10;
*b = 10;
//Chama a função soma
soma(a);
//Chama a função somaPonteiros passando o ponteiro b
somaPonteiros(b);
printf("O valor da variável A é %d e da variável B é %d\n", a, *b);
return 0;
}
Lembrando que em C , é necessário alocar o ponteiro em memória, (alocação dinâmica de memória), para isso utiliza a função malloc.
Neste exemplo muito básico, podemos perceber o poder dos ponteiros.
Perceba que as variáveis a e b são declaradas valendo 10. Após passarem por uma função de soma, o resultado do output "printf" será:
O valor da variável A é 10 e da variável B é 30
O que vimos foi ponteiros em ação. Na função soma que recebe apenas uma variável comum e não um ponteiro, o valor alterado permanece apenas em tempo de chamada da função. Isso porque ela não foi reservado um endereço especifico de memória pra ela se "salvar". A variável B quando passa pela função somaPonteiros, recebe o mesmo tratamento, mas como está alocada em memória, o valor dela não é alterado simplesmente em tempo de chamada de função, mas também em tempo de memória de EXECUÇÃO!
Em um exemplo prático e demonstrativo que os ponteiros são endereçados em memória:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a;
int *b;
b = malloc (a * sizeof (int *));
printf("Endereço de memória alocado para o ponteiro B: %d\n",&b);
return 1;
}
Output:
Endereço de memória alocado para o ponteiro B: -299569536
Endereço de memória alocado para o ponteiro B: -1692228912
Endereço de memória alocado para o ponteiro B: 1194939152
Endereço de memória alocado para o ponteiro B: -1644524176
Endereço de memória alocado para o ponteiro B: -1182933888
Pelo comando &, podemos ver o endereço de memória correspondente, a cada execução, indica um endereço diferente, isso porque não existe espaço de memória fixa para alocação.
Ponteiros podem simplesmente apontar para qualquer variável, isso quer dizer que ela está não está recebendo apenas o valor da variável, ela está compartilhando o valor daquela variável em tempo de execução!
Por exemplo:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a = 2;
int *b;
b = malloc (a * sizeof(int));
b = &a;
printf("O valor da variável A é %d e da variável B é %d\n", a, *b);
a = 10;
printf("O valor da variável A é %d e da variável B é %d\n", a, *b);
return 0;
}
Output:
O valor da variável A é 2 e da variável B é 2
O valor da variável A é 10 e da variável B é 10
Note que nem tocamos no valor de b e ele mudou seu valor copiando o de A. Simplesmente pois ele está compartilhando o endereço de memória da variável A pelo comando &.
Não quero mais que meu ponteiro compartilhe memória com a variável o que fazer? Simples, ou aponte para outra variável, ou simplesmente como dito acima, faça a variável apontar para uma região de memória nula, inexistente.
*b = null;
Ponteiros funcionam basicamente como arrays. Mas há também como simular matrizes com ponteiros. Neste caso usamos ponteiro para ponteiro.
O tal do Ponteiro para Ponteiro
Ponteiro para ponteiro são matrizes Bidimensionais, isso quer dizer que um ponteiro aponta para outro ponteiro , que por sua vez pode apontar para outro ponteiro que aponta para outro ponteiro e assim por diante.
Alocando ponteiro para ponteiro (Pointer To Pointer)
#include <stdio.h>
#include <stdlib.h>
int main()
{
int linhas = 5;
int colunas = 2;
int **pointerToPointer;
int i;
pointerToPointer = malloc (linhas * sizeof (int *));
for (i = 0; i < linhas; ++i) {
pointerToPointer[i] = malloc (colunas * sizeof (int));
}
return 1;
}
Exemplos muito utilizados com ponteiros são estruturas de dados como , pilha , fila e lista. Como não é padrão essas estruturas de dados em C. elas são construidas a partir de ponteiros. Isso porque, como o ponteiro utiliza parte da memória, os dados serão mantidos em tempo de execução. Diferente de um array comum que perde suas referências pois não possuem endereço como ponteiros possuem.
Por hoje é só pessoal , não perca a memória, utilize ponteiros!
Grande abraço!
Nenhum comentário:
Postar um comentário