O que é Pointer em C?
O Pointer em C, é uma variável que armazena o endereço de outra variável. Um ponteiro também pode ser usado para se referir a outra função de ponteiro. Um ponteiro pode ser incrementado / decrementado, ou seja, para apontar para o próximo / anterior local de memória. O objetivo do ponteiro é economizar espaço na memória e obter um tempo de execução mais rápido.
Como usar ponteiros em C
Se declararmos uma variável v do tipo int, v na verdade armazenará um valor.
v é igual a zero agora.
Porém, cada variável, além do valor, também tem seu endereço (ou, simplesmente, onde está localizada na memória). O endereço pode ser recuperado colocando um e comercial (&) antes do nome da variável.
Se você imprimir o endereço de uma variável na tela, ela ficará como um número totalmente aleatório (além disso, pode ser diferente de uma corrida para outra).
Vamos tentar isso na prática com o ponteiro em C exemplo
O resultado deste programa é -480613588.
Agora, o que é um ponteiro? Em vez de armazenar um valor, um ponteiro y armazenará o endereço de uma variável.
Variável de ponteiro
Int * y = & v;
VARIÁVEL |
POINTER |
Um valor armazenado em um endereço de armazenamento / memória nomeado |
Uma variável que aponta para o endereço de armazenamento / memória de outra variável |
Declarando um ponteiro
Como variáveis, ponteiros no programa C mming deve ser declarado antes de poder ser usado em seu programa. Os ponteiros podem ter o nome que você quiser, desde que obedeçam às regras de nomenclatura do C. Uma declaração de ponteiro tem o seguinte formato.
data_type * pointer_variable_name;
Aqui,
- data_type é o tipo de base do ponteiro dos tipos de variáveis C e indica o tipo da variável para a qual o ponteiro aponta.
- O asterisco (*: o mesmo asterisco usado para multiplicação) que é um operador de indireção, declara um ponteiro.
Vamos ver algumas declarações de ponteiros válidas neste tutorial de ponteiros C:
Inicializar um ponteiro
Depois de declarar um ponteiro, nós o inicializamos como variáveis padrão com um endereço de variável. Se os ponteiros na programação C não forem inicializados e usados no programa, os resultados serão imprevisíveis e potencialmente desastrosos.
Para obter o endereço de uma variável, usamos o operador e comercial (&), colocado antes do nome de uma variável cujo endereço precisamos. A inicialização do ponteiro é feita com a seguinte sintaxe.
Sintaxe do ponteiro
pointer = &variable;
Um programa simples para ilustração do ponteiro é fornecido abaixo:
Resultado:
Address stored in a variable p is:60ff08Value stored in a variable p is:10
Operador | Significado |
* | Serve 2 propósitos
|
& | Atende apenas a um propósito
|
Tipos de ponteiros em C
A seguir estão os diferentes tipos de ponteiros em C:
Ponteiro nulo
Podemos criar um ponteiro nulo atribuindo um valor nulo durante a declaração do ponteiro. Este método é útil quando você não possui nenhum endereço atribuído ao ponteiro. Um ponteiro nulo sempre contém o valor 0.
O programa a seguir ilustra o uso de um ponteiro nulo:
#include <stdio.h>int main(){int *p = NULL; //null pointerprintf("The value inside variable p is:\n%x”,p);return 0;}
Resultado:
The value inside variable p is:0
Ponteiro de void
Na programação C, um ponteiro de void também é chamado de ponteiro genérico. Ele não possui nenhum tipo de dados padrão. Um ponteiro void é criado usando a palavra-chave void. Ele pode ser usado para armazenar um endereço de qualquer variável.
O programa a seguir ilustra o uso de um ponteiro vazio:
#include <stdio.h>int main(){void *p = NULL; //void pointerprintf("The size of pointer is:%d\n",sizeof(p));return 0;}
Resultado:
The size of pointer is:4
Ponteiro curinga
Diz-se que um ponteiro é um ponteiro selvagem se não estiver sendo inicializado para nada. Esses tipos de ponteiros C não são eficientes porque podem apontar para alguma localização de memória desconhecida que pode causar problemas em nosso programa e pode levar ao travamento do programa. Deve-se sempre ter cuidado ao trabalhar com ponteiros selvagens.
O programa a seguir ilustra o uso de um ponteiro curinga:
#include <stdio.h>int main(){int *p; //wild pointerprintf("\n%d",*p);return 0;}
Saída
timeout: the monitored command dumped coresh: line 1: 95298 Segmentation fault timeout 10s main
Outros tipos de ponteiros em “c” são os seguintes:
- Ponteiro pendente
- Ponteiro complexo
- Ponteiro próximo
- Ponteiro distante
- Ponteiro enorme
Ponteiros de acesso direto e indireto
Em C, existem duas maneiras equivalentes para acessar e manipular um conteúdo variável
- Acesso direto: usamos diretamente o nome da variável
- Acesso indireto: usamos um ponteiro para a variável
Vamos entender isso com a ajuda do programa abaixo
Depois de compilar o programa sem erros, o resultado é:
Direct access, var = 1Indirect access, var = 1The address of var = 4202496The address of var = 4202496Indirect access, var = 48
Aritmética do ponteiro em C
As operações do ponteiro estão resumidas na figura a seguir
Operação prioritária (precedência)
Ao trabalhar com ponteiros C, devemos observar as seguintes regras de prioridade:
Se um ponteiro P apontar para uma variável X, então * P pode ser usado onde quer que X possa ser escrito.
As seguintes expressões são equivalentes:
No último caso, os parênteses são necessários: como os operadores unários * e ++ são avaliados da direita para a esquerda, sem os parênteses o ponteiro P seria incrementado, não o objeto para o qual P aponta.
A tabela abaixo mostra a operação aritmética e básica que pode ser usada ao lidar com ponteiros C
Operação | Explicação |
Atribuição | int * P1, * P2 P1 = P2; P1 e P2 apontam para a mesma variável inteira |
Incrementação e decrementação | Int * P1; P1 ++; P1–; |
Adicionando um deslocamento (Constante) | Isso permite que o ponteiro mova N elementos em uma tabela. O ponteiro será aumentado ou diminuído por N vezes o número de byte (s) do tipo da variável. P1 + 5; |
Ponteiros C & Arrays com exemplos
Tradicionalmente, nós acesse os elementos da matriz usando seu índice, mas esse método pode ser eliminado usando ponteiros. Os ponteiros facilitam o acesso a cada elemento da matriz.
Saída
12345
Adicionar um determinado número a um ponteiro moverá a localização do ponteiro para o valor obtido por uma operação de adição. Suponha que p seja um ponteiro que atualmente aponta para a localização de memória 0 se realizarmos a seguinte operação de adição, p + 1, então ele será executado desta maneira:
Como p atualmente aponta para o local 0 após adicionar 1, o valor se tornará 1 e, portanto, o ponteiro apontará para o local da memória 1.
Ponteiros C e Strings com exemplos
Uma string é uma matriz de objetos char, terminando com um caractere nulo “\ 0”. Podemos manipular strings usando ponteiros. Este ponteiro no exemplo C explica esta seção
Saída
First character is:HNext character is:ePrinting all the characters in a stringHelloGuru99!
Outra maneira de lidar com strings é com uma matriz de ponteiros como a seguir programa:
Resultado:
Please remember these materials:ironcoppergold
Vantagens dos ponteiros em C
- Os ponteiros são úteis para acessar locais de memória.
- Os ponteiros fornecem uma maneira eficiente de acessar os elementos de uma estrutura de array.
- Os ponteiros são usados para alocação de memória dinâmica, bem como desalocação.
- Os ponteiros são usados para formar estruturas de dados complexas, como lista vinculada, gráfico, árvore, etc.
Desvantagens dos ponteiros em C
- Os ponteiros são um pouco complexos para entender.
- Os ponteiros podem levar a vários erros, como falhas de segmentação, ou podem acessar um local de memória que não é necessário.
- Se um valor incorreto for fornecido a um ponteiro, pode causar corrupção de memória.
- Os ponteiros também são responsáveis pelo vazamento de memória.
- Os ponteiros são comparativamente mais lentos do que as variáveis.
- Os programadores acham muito difícil trabalhar com os ponteiros; portanto, é responsabilidade do programador manipular um ponteiro com cuidado.
Resumo
- Um ponteiro nada mais é que um local da memória onde os dados são armazenados.
- Um ponteiro é usado para acessar a localização da memória.
- Existem vários tipos de ponteiros, como um ponteiro nulo, um ponteiro selvagem, um ponteiro vazio e outros tipos de ponteiros.
- Ponteiros podem ser usados com array e string para acessar elementos de forma mais eficiente.
- Podemos criar ponteiros de função para invocar uma função dinamicamente.
- As operações aritméticas podem ser feitas em um ponteiro que é conhecido como aritmética de ponteiro.
- Os ponteiros também podem apontar para uma função, o que torna mais fácil chamar funções diferentes no caso de definir um array de ponteiros.
- Quando você deseja lidar com diferentes tipos de dados variáveis, você pode use um ponteiro void typecast.