Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Linguagem C

Dominando Ponteiros em C: Passos Práticos para Programação Avançada

Ponteiros em C são fáceis e divertidos de aprender. Algumas tarefas de programação C são realizadas mais facilmente com ponteiros, e outras tarefas, como alocação de memória dinâmica, não podem ser realizadas sem usar ponteiros. Então 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 é uma localização de memória e toda localização de memória tem seu endereço definido que pode ser acessado usando o operador & (ampersand), que denota um endereço na memória. Considere o seguinte exemplo, que imprime o endereço das variáveis definidas:

Live Demo
#include <stdio.h>
int main() {
    int var1;
    char var2[10];
    printf("Endereço da variável var1: %x\n", &var1);
    printf("Endereço da variável var2: %x\n", &var2);
    return 0;
}

Quando o código acima é compilado e executado, produz o seguinte resultado:

Endereço da variável var1: bff5a400
Endereço da variável var2: 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 de 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 ponteiro é:

type *var-name;

Aqui, type é o tipo base do ponteiro; deve ser um tipo de dado 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 instruçã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;    /* ponteiro para um inteiro */
double *dp; /* ponteiro para um double */
float *fp;  /* ponteiro para um float */
char *ch;   /* ponteiro para um caractere */

O tipo de dado real do valor de todos os ponteiros, seja inteiro, float, caractere ou outro, é 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 dado 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 muito frequentemente. (a) Definimos uma variável ponteiro, (b) atribuímos o endereço de uma variável a um ponteiro e (c) finalmente acessamos 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 por seu operando. O exemplo a seguir faz uso dessas operações:

Live Demo
#include <stdio.h>
int main() {
    int var = 20;   /* declaração de variável real */
    int *ip;        /* declaração de variável ponteiro */
    ip = &var;      /* armazena endereço de var na variável ponteiro */
    printf("Endereço da variável var: %x\n", &var);
    /* endereço armazenado na variável ponteiro */
    printf("Endereço armazenado na variável ip: %x\n", ip);
    /* acessa o valor usando o ponteiro */
    printf("Valor da variável *ip: %d\n", *ip);
    return 0;
}

Quando o código acima é compilado e executado, produz o seguinte resultado:

Endereço da variável var: bffd8b3c
Endereço armazenado na variável ip: bffd8b3c
Valor da variável *ip: 20

Ponteiros NULL

É sempre uma boa prática atribuir um valor NULL a uma variável ponteiro caso você não tenha um endereço exato para atribuir. Isso é feito no momento da declaração da variável. Um ponteiro que é atribuído NULL é chamado de ponteiro nulo.

O ponteiro NULL é uma constante com valor zero definida em várias bibliotecas padrão. Considere o seguinte programa:

Live Demo
#include <stdio.h>
int main() {
    int *ptr = NULL;
    printf("O valor de ptr é: %x\n", ptr);
    return 0;
}

Quando o código acima é compilado e executado, produz o seguinte resultado:

O valor de ptr é 0

Na maioria dos sistemas operacionais, programas não têm permissão para acessar memória no endereço 0 porque essa memória é reservada pelo sistema operacional. No entanto, o endereço de memória 0 tem significado especial; sinaliza que o ponteiro não se destina a apontar para uma localização de memória acessível. Mas por convenção, se um ponteiro contém o valor nulo (zero), assume-se que ele aponta para nada.

Para verificar um ponteiro nulo, você pode usar uma instrução 'if' da seguinte forma:

if(ptr)     /* sucede se p não é nulo */
if(!ptr)    /* sucede se p é nulo */

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 ponteiros devem estar claros para qualquer programador C:

Sr.No. Conceito & Descrição
1 Aritmética de ponteiros

Existem quatro operadores aritméticos que podem ser usados em ponteiros: ++, --, +, -

2 Array de ponteiros

Você pode definir arrays para armazenar um número de 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 chamadora pela função chamada.

5 Retornar ponteiro de funções em C

C permite que uma função retorne um ponteiro para variável local, variável static e memória alocada dinamicamente também.

Linguagem C

  1. Variáveis, Constantes e Literais em C: Um Guia Completo
  2. Entendendo Classes de Armazenamento em C: Escopo, Tempo de Vida e Performance
  3. Dominando Ponteiros em C: Um Tutorial Prático e Guiado por Especialistas
  4. Entendendo a Relação Entre Arrays e Ponteiros em C
  5. Programação C: Passando Endereços e Ponteiros para Funções – Guia Prático
  6. Dominando Structs e Ponteiros em C: Guia Prático
  7. Dominando a Palavra-chave Global do Python: Como e Quando Usá-la
  8. Dominando Ponteiros em C++: Conceitos, Exemplos e Aplicações Práticas
  9. Variáveis, Tipos de Dados e Constantes em C – Guia Prático
  10. Ponteiros em C: Guia Completo sobre Tipos, Uso e Melhores Práticas