Ponteiros
0
0

Ponteiros

Suponha que você declare uma variável denominada "Total" em seu programa. Essa variável será associada a um (ou mais) endereço(s) na memória (endereço 3001), conforme a figura abaixo:

Grey
3 min
0
0
  • Antes de apresentarmos ponteiros, vamos relembrar o conceito de variável.
  • A memória é formada por um conjunto de espaços, denominados variáveis, onde guardamos os dados.
  • Esses "espaços" são identificados por nomes (interno nos programas), e por números ou "endereços" (externos aos programas), utilizados pelos programas para acessar os dados.
  • A figura abaixo exibe um trecho da memória:
Email image
Email image
  • Agora você move o valor 100 para a variável Total (total = 100;), o programa procura o endereço da variável e move o valor.
Email image
  • Agora podemos começar a definir Ponteiros.
  • Ponteiros são variáveis que armazenam endereços (de outras variáveis) ao invés de amazenarem valor. O conteúdo de uma variável ponteiro é o endereço de outra variável.
  • Suponha que você defina a variável Ptr como sendo ponteiro e armazene o endereço 3001. Essa variável estará armazenando o endereço da variável Total, conforme figura abaixo:
Email image
  • Assim dizemos que a variável Ptr está "apontando" para variável Total, isto é, qualquer alteração em Ptr irá alterar o conteúdo de Total.
  • Os ponteiros são usados em muitas linguagens de programação para manipular cadeias de caracteres, passar parâmetros para funções, manipulação matrizes de dados e criação de listas ligadas e outras estruturas de dados complexas.
  • Ponteiros proporcionam uma grande flexibilidade para o gerenciamento de memória e otimização de programas.

  • Para se declarar uma variável em C, devemos declarar o seu tipo e dar um nome (identificador):

tipo_da_variável variavel1,...,variavelN;

  • Para se declarar uma variável ponteiro em C, é necessário também declarar o seu tipo e o nome, mas na frente do nome colocar um asterisco(*):

tipo_da_variável *variavel1,...,*variavelN;

  • É o asterisco (*) que informa ao compilador que aquela variável não vai guardar um valor mas sim um endereço para o tipo especificado.
Email image
  • Para serem usados, os ponteiros precisam ser inicializados. Para inicializarmos uma variável ponteiro com o endereço de outra variável, usamos o operador &.
Email image
  • Para imprimir o conteúdo da variável numero a partir do ponteiro p basta colocar o asterisco na frente da variável:
Email image

Exemplo

#include<stdio.h>
int main(){
int numero;
int *p;
numero = 100;
p = &numero; //Move o endereço da variável numero para p
printf("\nConteúdo de numero = %d", *p); //imprime o conteúdo da variável numero
*p = *p * 10; //multiplica o conteúdo da variável numero por 10
printf("\nConteúdo de numero = %d", numero);
}

Em resumo:

p : conteúdo é o endereço de memoria apontada por p (número);

*p : é o conteúdo da variável apontada por p (número);

&numero: é o endereço na memória da variável numero.


Operações com Ponteiros

Um ponteiro pode ter o valor especial NULL que é o "zero" (aponta para nenhum endereço) de ponteiros.

Exemplo

int *p = NULL;

Atribuição

  • O ponteiro ptr1 aponta para a mesma variável (endereço) que o ponteiro ptr.
#include <stdio.h>
int main(){
int *ptr, *ptr1;
int numero;
numero = 20;
ptr = &numero;
ptr1 = ptr; // ambos estão apontado para o endereço de número.
printf("\nptr = %d",*ptr);
printf("\nptr1 = %d",*ptr1);
}
  • a variável apontada por ptr1 recebe o mesmo conteúdo da variável apontada por ptr;
#include <stdio.h>
int main(){
int *ptr, *ptr1;
int numero, total;
numero = 20;
total = 10;
ptr = &numero;
ptr1 = &total;
*ptr1 = *ptr; // as variáveis numero e total contém o mesmo valor de número.
printf("\nNumero = %d",numero);
printf("\nTotal = %d",total);
}
  • Apenas duas operações aritméticas podem ser utilizadas com ponteiros: adição e subtração. Muito util para trabalhar com vetores.
  • Podemos somar e subtrair apenas valores INTEIROS.
p++;
soma +1 no endereço armazenado no ponteiro.
p--;
subtrai 1 no endereço armazenado no ponteiro.
  • Com relação ao conteúdo apontado, valem todas as operações
(*p)++;
incrementar o conteúdo da variável apontada pelo ponteiro p;
*p = (*p) * 10;
multiplica o conteúdo da variável apontada pelo ponteiro p por 10;
  • Operações relacionais
== e != para saber se dois ponteiros são iguais ou diferentes.
>, <, >= e <= para saber qual a posição (endereço) mais alta na memória ocupado por um ponteiro.

Ponteiros e Vetores

  • Vetores são conjuntos de dados do mesmo tipo dispostos contiguamente (um depois do outro) na memória.
  • No momento da declaração de um vetor, informamos ao computador para reservar uma certa quantidade de memória a fim de armazenar os elementos do array de forma sequencial.
  • A variavel vetor é um ponteiro que aponta para o começo da sequência elementos do vetor na memória. Portanto, podemos inicializar uma variável ponteiro com o endereço de início do vetor.
Email image
#include<stdio.h>
int main() {
char *ptr;
int i;
char vet[5] = {'a', 'b', 'c', 'd', 'e'};
ptr = vet; // A variavel ponteiro ptr aponta para o primeiro elemento do vetor
for (i=0; i < 5; i++){
printf("\nVet[%d] = %c ptr = %c", i, vet[i], *ptr); // o conteudo do vetor acessado pela variavel e pelo ponteiro
ptr++;
}
}
  • Em Resumo:*p é equivalente a vet[0]; vet[índice] é equivalente a *(p+índice);vet é equivalente a &vet[0];&vet[índice] é equivalente a (vet + índice);
  • As matrizes, apesar de terem mais de uma dimensão, são dispostas linearmente na memória e, por isso, podem ser manipuladas com ponteiros semelhante aos vetores.

Ex.: int mat[5][5];

Email image