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

Ponteiros em C:O que é ponteiro em programação C? Tipos

O que é ponteiro em C?


O Ponteiro 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/diminuído, ou seja, para apontar para a próxima/anterior localização de memória. O objetivo do ponteiro é economizar espaço de 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.

No entanto, 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, parecerá um número totalmente aleatório (além disso, pode ser diferente de execução para execução).

Vamos tentar isso na prática com ponteiro no exemplo C



A saída deste programa é -480613588.

Agora, o que é um ponteiro? Em vez de armazenar um valor, um ponteiro armazenará o endereço de uma variável.

Variável de ponteiro

Int *y =&v;
VARIABLEPOINTERA valor armazenado em um nomeado endereço de armazenamento/memóriaUma variável que aponta para o endereço de armazenamento/memória de outro variável

Declarando um ponteiro


Assim como as variáveis, os ponteiros na programação C precisam ser declarados antes que possam ser usados ​​em seu programa. Os ponteiros podem ser nomeados como 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,

Vamos ver algumas declarações de ponteiros válidas neste tutorial de ponteiros C:
int    *ptr_thing;            /* pointer to an integer */ 
int *ptr1,thing;/* ptr1 is a pointer to type integer and thing is an integer variable */
double    *ptr2;    /* pointer to a double */
float    *ptr3;      /* pointer to a float */
char    *ch1 ;       /* pointer to a character */
float  *ptr, variable;/*ptr is a pointer to type float and variable is an ordinary float variable */

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 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 de ponteiro é dado abaixo:
#include <stdio.h>
int main()
{
   int a=10;    //variable declaration
   int *p;      //pointer variable declaration
   p=&a;        //store address of variable a in pointer p
   printf("Address stored in a variable p is:%x\n",p);  //accessing the address
   printf("Value stored in a variable p is:%d\n",*p);   //accessing the value
   return 0;
}

Saída:
Address stored in a variable p is:60ff08
Value stored in a variable p is:10
Operador Significado * Serve 2 propósitos

  1. Declaração de um ponteiro
  2. Retorna o valor da variável referenciada
&Serve apenas para 1 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 valor nulo durante a declaração do ponteiro. Este método é útil quando você não tem 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 pointer
	printf(“The value inside variable p is:\n%x”,p);
	return 0;
}

Saída:
The value inside variable p is:
0

Ponteiro vazio


Na programação C, um ponteiro void também é chamado de ponteiro genérico. 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 void:
#include <stdio.h>
int main()
{
void *p = NULL; 	//void pointer
printf("The size of pointer is:%d\n",sizeof(p));
return 0;
}

Saída:
The size of pointer is:4

Ponteiro selvagem


Um ponteiro é considerado 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 algum local de memória desconhecido 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 do ponteiro selvagem:
#include <stdio.h>
int main()
{
int *p; 	//wild pointer
printf("\n%d",*p);
return 0;
}

Saída:
timeout: the monitored command dumped core
sh: line 1: 95298 Segmentation fault      timeout 10s main

Outros tipos de ponteiros em 'c' são os seguintes:

Ponteiros de acesso direto e indireto


Em C, existem duas maneiras equivalentes de acessar e manipular um conteúdo variável

Vamos entender isso com a ajuda do programa abaixo
#include <stdio.h>
/* Declare and initialize an int variable */
int var = 1;
/* Declare a pointer to int */
int *ptr;
int main( void )
{
/* Initialize ptr to point to var */
ptr = &var;
/* Access var directly and indirectly */
printf("\nDirect access, var = %d", var);
printf("\nIndirect access, var = %d", *ptr);
/* Display the address of var two ways */
printf("\n\nThe address of var = %d", &var);
printf("\nThe address of var = %d\n", ptr);
/*change the content of var through the pointer*/
*ptr=48;
printf("\nIndirect access, var = %d", *ptr);
return 0;}

Após compilar o programa sem erros, o resultado é:
Direct access, var = 1
Indirect access, var = 1

The address of var = 4202496
The address of var = 4202496

Indirect access, var = 48

Aritmética de 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:
  • Os operadores * e &têm a mesma prioridade que os operadores unários (a negação!, o incremento++, o decremento–).
  • Na mesma expressão, os operadores unários *, &,!, ++, – são avaliados da direita para a esquerda.

Se um ponteiro P aponta 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:
int X =10


int *P =&Y;

Para o código acima, as expressões abaixo são verdadeiras
ExpressãoExpressão EquivalenteY=*P+1


*P=*P+10

*P+=2

+****P

(*P)++
Y=X+1


X=X+10

X+=2

++X

X++

Neste ú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çãoint *P1,*P2
P1=P2;
P1 e P2 apontam para o mesmo inteiro variableIncrementation e decrementationInt *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 em N vezes o número de byte(s) do tipo da variável.
P1+5;

Ponteiros C e matrizes com exemplos


Tradicionalmente, acessamos os elementos do array usando seu índice, mas esse método pode ser eliminado usando ponteiros. Os ponteiros facilitam o acesso a cada elemento da matriz.
#include <stdio.h>
int main()
{
    int a[5]={1,2,3,4,5};   //array initialization
    int *p;     //pointer declaration
               /*the ptr points to the first element of the array*/

    p=a; /*We can also type simply ptr==&a[0] */
    
    printf("Printing the array elements using pointer\n");
    for(int i=0;i<5;i++)    //loop for traversing array elements
    {
        	printf("\n%x",*p);  //printing array elements
        	p++;    //incrementing to the next element, you can also write p=p+1
    }
    return 0;
}

Saída:
1
2
3
4
5

Adicionar um número específico 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 posiçã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 de 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
#include <stdio.h>
#include <string.h>
int main()
{
char str[]="Hello Guru99!";
char *p;
p=str;
printf("First character is:%c\n",*p);
p =p+1;
printf("Next character is:%c\n",*p);
printf("Printing all the characters in a string\n");
p=str;  //reset the pointer
for(int i=0;i<strlen(str);i++)
{
printf("%c\n",*p);
p++;
}
return 0;
}

Saída:
First character is:H
Next character is:e
Printing all the characters in a string
H
e
l
l
o

G
u
r
u
9
9
!

Outra maneira de lidar com strings é com um array de ponteiros como no programa a seguir:
#include <stdio.h>
int main(){
char *materials[ ] = {  "iron",  "copper",  "gold"};
printf("Please remember these materials :\n");
int i ;
for (i = 0; i < 3; i++) {
  printf("%s\n", materials[ i ]);}
  return 0;}

Saída:
Please remember these materials:
iron
copper
gold

Vantagens dos ponteiros em C

  • Ponteiros são úteis para acessar locais de memória.
  • Ponteiros fornecem uma maneira eficiente de acessar os elementos de uma estrutura de matriz.
  • Os ponteiros são usados ​​para alocação dinâmica de memória e 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 de entender.
  • 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, isso poderá causar corrupção de memória.
  • Ponteiros também são responsáveis ​​pelo vazamento de memória.
  • Os ponteiros são comparativamente mais lentos que os das 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 é do que um local de memória onde os dados são armazenados.
  • Um ponteiro é usado para acessar o local da memória.
  • Existem vários tipos de ponteiros, como ponteiro nulo, ponteiro selvagem, ponteiro void e outros tipos de ponteiros.
  • Ponteiros podem ser usados ​​com array e string para acessar elementos com mais eficiência.
  • Podemos criar ponteiros de função para invocar uma função dinamicamente.
  • As operações aritméticas podem ser feitas em um ponteiro conhecido como aritmética de ponteiro.
  • Ponteiros também podem apontar para funções que facilitam a chamada de funções diferentes no caso de definir uma matriz de ponteiros.
  • Quando você deseja lidar com diferentes tipos de dados de variáveis, você pode usar um ponteiro void typecast.

Linguagem C

  1. Variáveis ​​C# e tipos de dados (primitivos)
  2. Tipos de funções definidas pelo usuário na programação C
  3. Ponteiros C
  4. Ponteiros C++ com exemplos
  5. O que é impressão 3D? Princípio de funcionamento | Tipos | Aplicativos
  6. Java - Tipos de Variáveis
  7. C - Ponteiros
  8. Tipos de variáveis ​​C++
  9. Python - Tipos de Variáveis
  10. O que é soldagem?- Definição | Tipos de Soldagem