Os ponteiros são como utilitários especiais, que facilitam o mapeamento em um código de programa. Ao contrário de outras variáveis, os ponteiros armazenam OS endereços de outras variáveis. Neste tutorial de ‘Ponteiros em C’, você examinará:
- O que são ponteiros em C?
- De quantas maneiras você pode acessar variáveis?
- Quais são os diferentes tipos de ponteiros?
- Quais são os casos de uso de ponteiros em C?
- Quais são as vantagens dos ponteiros em C?
- Quais são as desvantagens dos ponteiros em C?
- Quais são os principais pontos?
O que são ponteiros em C?
Um ponteiro é uma variável que aponta para o endereço de outra variável. É declarado junto com um símbolo de asterisco (*). A sintaxe para declarar um ponteiro é a seguinte:
tipo de dados * var1
A sintaxe para atribuir o endereço de uma variável a um ponteiro é:
tipo de dados var1, * var2;
var2=& var1;
De quantas maneiras você pode acessar as variáveis?
Você pode acessar uma variável de duas maneiras.
- Acesso direto: você pode usar diretamente o nome da variável para acessar a variável.
- Acesso indireto: você usa um ponteiro para acessar essa variável.
Exemplo:
#include
int main ()
{
int a=5, * ptr;
ptr=& a;
printf (“Acesso direto, a=% d \ n”, a);
printf (“Acesso indireto, a=% d \ n”, * ptr);
return 0;
}
Quais são os diferentes tipos de indicadores?
Existem basicamente quatro tipos de ponteiros, eles são:
- Ponteiro Nulo
- Void Pointer
- Wild Pointer
- Ponteiro pendente
Ponteiro Nulo:
Se você atribuir um valor NULL a um ponteiro durante sua declaração, ele é chamado de Ponteiro Nulo.
Sintaxe:
Int * var=NULL;
Exemplo:
#include
int main ()
{
int * var=NULL;
printf (“var=% d”, * var);
}
Ponteiro de vazio:
Quando um ponteiro é declarado com uma palavra-chave void, ele é chamado de ponteiro void. Para imprimir o valor deste ponteiro, você precisa fazer um typecast dele.
Sintaxe:
void * var;
Exemplo:
#include
int main ()
{
int a=2;
void * ptr;
ptr=& a;
printf (“Após a modelagem, a=% d”, * (int *) ptr);
return 0;
}
Wild Pointer:
Um ponteiro curinga é apenas declarado, mas não é atribuído a um endereço de qualquer variável. Eles são muito complicados e podem causar erros de segmentação.
Exemplo:
#include
int main ()
{
int * ptr;
printf (“ptr=% d”, * ptr);
return 0;
}
Ponteiro pendente
- Suponha que haja um ponteiro p apontando para uma variável na memória 1004. Se você desalocar essa memória, esse p é chamado de ponteiro pendente.
- Você pode desalocar uma memória usando uma função free ().
Exemplo:
#include
#include
int main ()
{
int * ptr=(int *) malloc (sizeof (int));
int a=5;
ptr=& a;
grátis (ptr);
//agora, este ptr é conhecido como ponteiro pendurado.
printf (“Depois de desalocar sua memória * ptr=% d”, * ptr);
return 0;
}
Até agora, você aprendeu sobre os tipos de ponteiros. Agora, você examinará aspectos mais práticos. Vamos discutir alguns casos de uso de ponteiros em C.
Quais são os casos de uso de ponteiros em C?
- Aritmética de ponteiro
- Ponteiro a ponteiro
- Matriz de ponteiros
- Chamada por valor
- Chamada por referência
Aritmética do ponteiro:
- Incremento: você pode usar este operador para pular de um índice para o próximo índice em uma matriz.
Sintaxe:
ptr ++;
Exemplo:
#include
int main () {
int arr [3]={50, 150, 200};
int * ptr;
ptr=arr;
para (int i=0; i <3; i ++)
{
printf (“Valor de * ptr=% d \ n”, * ptr);
printf (“Endereço de * ptr=% d \ n”, ptr);
ptr ++;
}
- Decremento: você pode usar este operador para pular de um índice para o índice anterior em uma matriz.
Sintaxe:
Ptr–;
Exemplo:
#include
int main ()
{
int arr [3]={50, 150, 200};
int * ptr;
ptr=& arr [2];
para (int i=0; i <3; i ++)
{
printf (“Valor de * ptr=% d \ n”, * ptr);
printf (“Endereço de * ptr=% d \ n \ n”, ptr);
ptr–;
}
}
- Inteiros adicionados a um ponteiro: você pode usar este operador para pular de um índice para o próximo i-ésimo índice em uma matriz.
Sintaxe:
ptr +=i;//onde ‘i’ é um inteiro
Exemplo:
#include
int main () {
int arr [5]={10, 100, 200, 300, 500};
int * ptr;
ptr=& arr [0];
para (int i=0; i <5; i ++) {
printf (“Valor de * ptr=% d \ n”, * ptr);
printf (“Endereço de * ptr=% d \ n \ n”, ptr);
ptr=ptr + 2;
}
}
- Inteiros subtraídos de um ponteiro: você pode usar este operador para pular de um índice para o iésimo índice anterior em uma matriz.
Sintaxe:
ptr-=i;//onde ‘i’ é um número inteiro
Exemplo:
#include
int main () {
int arr [5]={10, 100, 200, 300, 500};
int * ptr;
ptr=& arr [4];
para (int i=0; i <5; i ++)
{
printf (“Valor de * ptr=% d \ n”, * ptr);
printf (“endereço de * ptr=% d \ n \ n”, ptr);
ptr-=2;
}
}
- Precedência:
- Operadores * e & recebem as mesmas prioridades dos operadores unários (incremento ++, decremento–).
- Os operadores unários *, &, ++,-são avaliados da direita para a esquerda na mesma expressão.
- Se um P apontar para uma variável X, você pode trocar X por * P.
Expressão |
Expressão equivalente |
Y=X + 1 |
Y=* P + 1 |
X=X + 10 |
* P=* P + 10 |
X +=2 |
* P +=2 |
++ X |
++ * P |
X ++ |
(* P) ++ |
Ponteiro a Ponteiro:
Nessa situação, um ponteiro apontará indiretamente para uma variável por meio de outro ponteiro.
Sintaxe:
Int ** ptr;
Exemplo:
#include
int main ()
{
int var, * ptr1, ** ptr2;
var=10;
ptr1=& var;
ptr2=& ptr1;
printf (“Valor de var=% d \ n”, var);
printf (“Valor disponível em * ptr1=% d \ n”, * ptr1);
printf (“Valor disponível em ** ptr2=% d \ n”, ** ptr2);
return 0;
}
Uma matriz de ponteiro:
Uma matriz do ponteiro é uma matriz em que cada elemento é um ponteiro.
Sintaxe:
int * arr [n]//onde n é o tamanho da matriz.
Exemplo:
#include
int main ()
{
int a [3]={10, 100, 200}, n=3;
int i, * ptr [3];
para (i=0; i <3; i ++)
{
ptr [i]=& a [i];
}
para (i=0; i { printf (“Valor de a [% d]=% d \ n”, i, * ptr [i]); } return 0; } Em ‘chamada por valor’, você deve copiar os valores da variável e passá-los na chamada de função como um parâmetro. Se você modificar esses parâmetros, isso não mudará o valor da variável real. #include anular alteração (int num) { printf (“Antes de adicionar valor dentro da função num=% d \ n”, num); num=num + 100; printf (“Depois de adicionar valor dentro da função num=% d \ n”, num); } int main () { int x=100; printf (“Antes da chamada da função x=% d \ n”, x); alterar (x); printf (“Após a chamada da função x=% d \ n”, x); return 0; } Na chamada por referência, você deve pegar o endereço da variável e passá-lo na chamada da função como um parâmetro. Se você modificar esses parâmetros, o valor da variável real também será alterado. #include void change (int * num) { printf (“Antes de adicionar valor dentro da função num=% d \ n”, * num); (* num) +=100; printf (“Depois de adicionar valor dentro da função num=% d \ n”, * num); } int main () { int x=100; printf (“Antes da chamada da função x=% d \ n”, x); change (& x);//passando referência na função printf (“Após a chamada da função x=% d \ n”, x); return 0; } Você é um desenvolvedor web ou está interessado em construir um site? Inscreva-se no Full Stack Web Developer-Programa MEAN Stack Master . Explore a visualização do curso! “Arrays em estruturas de dados”pode ser sua próxima parada. Arrays em estruturas de dados podem ser úteis na programação competitiva e outras implementações de estrutura de dados. Os arrays alocam memória em locais de memória contíguos para todos os seus elementos, facilitando o acesso aos elementos. Você deseja aprender mais e dominar as principais linguagens de programação da atualidade? Bem, Desenvolvedor Full Stack Web-MEAN Stack O programa de mestrado oferece exatamente isso e muito mais. Este programa de treinamento globalmente reconhecido abrange mais de 20 habilidades e ferramentas exigidas que você aprenderá por meio de uma abordagem de aprendizagem aplicada com 10 projetos de fim de aula, 4 projetos de fim de fase e um projeto principal em 4 domínios da indústria. Explore o curso hoje. Se você tiver alguma dúvida sobre “Ponteiros em C”, sinta-se à vontade para deixá-la na seção de comentários abaixo. Nossa equipe de especialistas 24 horas por dia, 7 dias por semana, responderá a todas as suas dúvidas o mais rápido possível! Chamada por valor:
Exemplo:
Chamada por referência:
Exemplo:
Quais são as vantagens dos ponteiros em C?
Quais são as desvantagens dos ponteiros?
Quais são as principais vantagens?
Próximas etapas