logo

Ponteiros C

O ponteiro na linguagem C é uma variável que armazena o endereço de outra variável. Esta variável pode ser do tipo int, char, array, função ou qualquer outro ponteiro. O tamanho do ponteiro depende da arquitetura. No entanto, na arquitetura de 32 bits, o tamanho de um ponteiro é de 2 bytes.

Considere o exemplo a seguir para definir um ponteiro que armazena o endereço de um número inteiro.

 int n = 10; int* p = &n; // Variable p of type pointer is pointing to the address of the variable n of type integer. 

Declarando um ponteiro

O ponteiro em linguagem c pode ser declarado usando * (símbolo de asterisco). Também é conhecido como ponteiro indireto, usado para desreferenciar um ponteiro.

 int *a;//pointer to int char *c;//pointer to char 

Exemplo de ponteiro

Um exemplo de uso de ponteiros para imprimir o endereço e o valor é fornecido abaixo.

exemplo de ponteiro

Como você pode ver na figura acima, a variável ponteiro armazena o endereço da variável numérica, ou seja, fff4. O valor da variável numérica é 50. Mas o endereço da variável ponteiro p é aaa3.

Com a ajuda de * ( operador indireto ), podemos imprimir o valor da variável ponteiro p.

lançar tratamento de exceções em java

Vamos ver o exemplo do ponteiro conforme explicado na figura acima.

 #include int main(){ int number=50; int *p; p=&number;//stores the address of number variable printf('Address of p variable is %x 
',p); // p contains the address of the number therefore printing p gives the address of number. printf('Value of p variable is %d 
',*p); // As we know that * is used to dereference a pointer therefore if we print *p, we will get the value stored at the address contained by p. return 0; } 

Saída

 Address of number variable is fff4 Address of p variable is fff4 Value of p variable is 50 

Ponteiro para matriz

 int arr[10]; int *p[10]=&arr; // Variable p of type pointer is pointing to the address of an integer array arr. 

Ponteiro para uma função

 void show (int); void(*p)(int) = &display; // Pointer p is pointing to the address of a function 

Ponteiro para estrutura

 struct st { int i; float f; }ref; struct st *p = &ref; 
c ponteiros

Vantagem do ponteiro

1) Ponteiro reduz o código e melhora o desempenho , é usado para recuperar strings, árvores, etc. e usado com arrays, estruturas e funções.

tornar o script executável

2) Podemos retornar vários valores de uma função usando o ponteiro.

3) Isso torna você capaz de acessar qualquer local de memória na memória do computador.

Uso de ponteiro

Existem muitas aplicações de ponteiros na linguagem c.

1) Alocação dinâmica de memória

Na linguagem c, podemos alocar memória dinamicamente usando as funções malloc() e calloc() onde o ponteiro é usado.

2) Matrizes, funções e estruturas

Ponteiros em linguagem c são amplamente utilizados em arrays, funções e estruturas. Reduz o código e melhora o desempenho.

Endereço do operador (&)

O endereço do operador '&' retorna o endereço de uma variável. Mas precisamos usar %u para exibir o endereço de uma variável.

 #include int main(){ int number=50; printf('value of number is %d, address of number is %u',number,&number); return 0; } 

Saída

 value of number is 50, address of number is fff4 

Ponteiro nulo

Um ponteiro ao qual não é atribuído nenhum valor, mas NULL, é conhecido como ponteiro NULL. Se você não tiver nenhum endereço a ser especificado no ponteiro no momento da declaração, poderá atribuir o valor NULL. Isso fornecerá uma abordagem melhor.

 int *p=NULL; 

Na maioria das bibliotecas, o valor do ponteiro é 0 (zero).

quem fez a escola

Programa Ponteiro para trocar dois números sem usar a 3ª variável.

 #include int main(){ int a=10,b=20,*p1=&a,*p2=&b; printf('Before swap: *p1=%d *p2=%d',*p1,*p2); *p1=*p1+*p2; *p2=*p1-*p2; *p1=*p1-*p2; printf('
After swap: *p1=%d *p2=%d',*p1,*p2); return 0; } 

Saída

 Before swap: *p1=10 *p2=20 After swap: *p1=20 *p2=10 

Lendo ponteiros complexos

Há várias coisas que devem ser levadas em consideração ao ler os ponteiros complexos em C. Vejamos a precedência e associatividade dos operadores que são utilizados em relação aos ponteiros.

OperadorPrecedênciaAssociatividade
(), []1Da esquerda para direita
*, identificador2Direita para esquerda
Tipo de dados3-

Aqui, devemos notar que,

  • (): Este operador é um operador de colchete usado para declarar e definir a função.
  • []: Este operador é um operador subscrito de array
  • *: Este operador é um operador de ponteiro.
  • Identificador: É o nome do ponteiro. A prioridade sempre será atribuída a isso.
  • Tipo de dados: O tipo de dados é o tipo da variável para a qual o ponteiro pretende apontar. Também inclui o modificador como assinado int, longo, etc.).

Como ler o ponteiro: int (*p)[10].

sair da conta do Google no Android

Para ler o ponteiro, devemos ver que () e [] têm precedência igual. Portanto, sua associatividade deve ser considerada aqui. A associatividade é da esquerda para a direita, então a prioridade vai para ().

Dentro do colchete (), o operador ponteiro * e o nome do ponteiro (identificador) p têm a mesma precedência. Portanto, deve-se considerar aqui a associatividade deles que é da direita para a esquerda, então a prioridade vai para p, e a segunda prioridade vai para *.

Atribua a terceira prioridade a [], pois o tipo de dados tem a última precedência. Portanto, o ponteiro terá a seguinte aparência.

  • caractere -> 4
  • * -> 2
  • p -> 1
  • [10] -> 3

O ponteiro será lido como p é um ponteiro para uma matriz de inteiros de tamanho 10.

Exemplo

Como ler o seguinte ponteiro?

 int (*p)(int (*)[2], int (*)void)) 

Explicação

Este ponteiro será lido como p é um ponteiro para uma função que aceita o primeiro parâmetro como o ponteiro para uma matriz unidimensional de inteiros de tamanho dois e o segundo parâmetro como o ponteiro para uma função cujo parâmetro é nulo e o tipo de retorno é o inteiro.