C - Ponteiros
Ponteiros em C são fáceis e divertidos de aprender. Algumas tarefas de programação C são executadas mais facilmente com ponteiros, e outras tarefas, como alocação dinâmica de memória, não podem ser executadas sem o uso de ponteiros. Portanto, torna-se necessário aprender ponteiros para se tornar um programador C perfeito. Vamos começar a aprendê-los em passos simples e fáceis.
Como você sabe, toda variável é um local de memória e todo local de memória tem seu endereço definido que pode ser acessado usando o operador e comercial (&), que denota um endereço na memória. Considere o exemplo a seguir, que imprime o endereço das variáveis definidas −
Demonstração ao vivo
#include <stdio.h> int main () { int var1; char var2[10]; printf("Address of var1 variable: %x\n", &var1 ); printf("Address of var2 variable: %x\n", &var2 ); return 0; }
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Address of var1 variable: bff5a400 Address of var2 variable: bff5a3f6
O que são ponteiros?
Um ponteiro é uma variável cujo valor é o endereço de outra variável, ou seja, endereço direto da localização da memória. Como qualquer variável ou constante, você deve declarar um ponteiro antes de usá-lo para armazenar qualquer endereço de variável. A forma geral de uma declaração de variável de ponteiro é −
type *var-name;
Aqui, digite é o tipo base do ponteiro; deve ser um tipo de dados C válido e var-name é o nome da variável ponteiro. O asterisco * usado para declarar um ponteiro é o mesmo asterisco usado para multiplicação. No entanto, nesta declaração o asterisco está sendo usado para designar uma variável como um ponteiro. Dê uma olhada em algumas das declarações de ponteiro válidas -
int *ip; /* pointer to an integer */ double *dp; /* pointer to a double */ float *fp; /* pointer to a float */ char *ch /* pointer to a character */
O tipo de dados real do valor de todos os ponteiros, sejam inteiros, flutuantes, caracteres ou outros, é o mesmo, um número hexadecimal longo que representa um endereço de memória. A única diferença entre ponteiros de diferentes tipos de dados é o tipo de dados da variável ou constante para a qual o ponteiro aponta.
Como usar ponteiros?
Existem algumas operações importantes, que faremos com a ajuda de ponteiros com muita frequência. (a) Definimos uma variável de ponteiro, (b) atribuir o endereço de uma variável a um ponteiro e (c) finalmente acessar o valor no endereço disponível na variável ponteiro. Isso é feito usando o operador unário * que retorna o valor da variável localizada no endereço especificado pelo seu operando. O exemplo a seguir faz uso dessas operações -
Demonstração ao vivo
#include <stdio.h> int main () { int var = 20; /* actual variable declaration */ int *ip; /* pointer variable declaration */ ip = &var; /* store address of var in pointer variable*/ printf("Address of var variable: %x\n", &var ); /* address stored in pointer variable */ printf("Address stored in ip variable: %x\n", ip ); /* access the value using the pointer */ printf("Value of *ip variable: %d\n", *ip ); return 0; }
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Address of var variable: bffd8b3c Address stored in ip variable: bffd8b3c Value of *ip variable: 20
Ponteiros NULL
É sempre uma boa prática atribuir um valor NULL a uma variável de ponteiro caso você não tenha um endereço exato a ser atribuído. Isso é feito no momento da declaração da variável. Um ponteiro que é atribuído NULL é chamado de null ponteiro.
O ponteiro NULL é uma constante com valor zero definido em várias bibliotecas padrão. Considere o seguinte programa -
Demonstração ao vivo
#include <stdio.h> int main () { int *ptr = NULL; printf("The value of ptr is : %x\n", ptr ); return 0; }
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
The value of ptr is 0
Na maioria dos sistemas operacionais, os programas não têm permissão para acessar a memória no endereço 0 porque essa memória é reservada pelo sistema operacional. No entanto, o endereço de memória 0 tem um significado especial; ele sinaliza que o ponteiro não se destina a apontar para um local de memória acessível. Mas, por convenção, se um ponteiro contiver o valor nulo (zero), supõe-se que ele aponte para nada.
Para verificar um ponteiro nulo, você pode usar uma instrução 'if' da seguinte maneira -
if(ptr) /* succeeds if p is not null */ if(!ptr) /* succeeds if p is null */
Ponteiros em detalhes
Ponteiros têm muitos conceitos fáceis e são muito importantes para a programação C. Os seguintes conceitos importantes de ponteiro devem ser claros para qualquer programador C -
Nº Sr. | Conceito e Descrição |
---|---|
1 | Aritmética de ponteiro Existem quatro operadores aritméticos que podem ser usados em ponteiros:++, --, +, - |
2 | Matriz de ponteiros Você pode definir matrizes para armazenar vários ponteiros. |
3 | Ponteiro para ponteiro C permite que você tenha ponteiro em um ponteiro e assim por diante. |
4 | Passando ponteiros para funções em C Passar um argumento por referência ou por endereço permite que o argumento passado seja alterado na função de chamada pela função chamada. |
5 | Retorna o ponteiro de funções em C C permite que uma função retorne um ponteiro para a variável local, variável estática e memória alocada dinamicamente também. |
Linguagem C
- Variáveis C, Constantes e Literais
- Classe de armazenamento C
- Ponteiros C
- Relação entre arrays e ponteiros
- Endereços e ponteiros de passagem C
- Estruturas e ponteiros C
- Palavra-chave global do Python
- Ponteiros C++ com exemplos
- Variável C, Tipos de Dados, Constantes
- Ponteiros em C:O que é ponteiro em programação C? Tipos