Mudanças entre as edições de "Linguagem C: Ponteiros"

De Aulas
 
Linha 3: Linha 3:
 
= Ponteiros =
 
= Ponteiros =
  
[[Image:Anya_int_pointer.jpg|400px|thumb|Ponteiros]]
+
[[Image:Anya_int_pointer.jpg|300px|thumb|Anya / Ponteiros]]
  
 
Ponteiros são fundamentais para a programação bem sucedida em C:
 
Ponteiros são fundamentais para a programação bem sucedida em C:

Edição atual tal como às 08h44min de 17 de julho de 2022

Links Relacionados: Programação em C

Ponteiros

Anya / Ponteiros

Ponteiros são fundamentais para a programação bem sucedida em C:

  • Passagem de parâmetros por referência;
  • Alocação dinâmica de memória;
  • Aumentar a eficiência de certas rotinas.

Essencialmente, um ponteiro nada mais é do que uma variável que, ao invés de conter um valor, contém um endereço de memória.

O conceito de utilizar espaço em memória não é em absoluto novo. De fato, linguagens de máquina utilizam tal conceito todo o tempo.

Exemplo 1 – mnemônico (Intel 80C51) que executa a soma do conteúdo da RAM interna apontada por Ri ao Acumulador:

ADD A, @RI

Declaração de Ponteiros

<tipo> *<nome_variavel>

Exemplo2 - exemplo da declaração de diversos ponteiros:

1int *iptr;
2float *fptr;
3char *cptr;

Como um ponteiro armazena um endereço de memória e não um valor específico, pode parecer estranho a primeira vista que seja requerida a associação de um tipo ao se declaram um ponteiro. No entanto, muito comumente, deseja-se acessar o valor armazenado pela variável apontada por um ponteiro. Desta forma, o tipo do ponteiro serve para instruir o compilador na maneira pela qual o dado apontado será acessado. Essencialmente, o tipo de dados e a codificação do dado (como os bits serão interpretados, necessário por exemplo para tipos com base na notação de ponto flutuante).

Operadores de Ponteiros

  • "*" conteúdo: aplicado a um variável tipo ponteiro, retorna o conteúdo do endereço apontado pelo ponteiro;
  • "&" endereço: aplicado a uma variável, retorna seu endereço de memória.

Exemplo 3 – exemplo da utilização de ambos os operadores unários:

1int count; 
2int *iptr; 
3iptr = &count; 
4printf(%d, *iptr);

Exemplo 1

 1#include <stdio.h>
 2#include <stdlib.h>
 3
 4int main () {
 5	int A = 3;
 6	int *p;
 7
 8	printf("valor(A) = %d\n", A);
 9	printf("end(A)   = %p\n", &A);
10
11	p = &A;
12
13	printf("valor(p) = %p\n", p);
14	printf("end(p)   = %p\n", &p);
15	printf("valorApontado(p) = %d\n", *p);
16
17	*p = 5;
18
19	printf("valor(A) = %d\n", A);
20	printf("end(A)   = %p\n", &A);
21	getchar();
22	return 0;
23}

Inicialização de Ponteiros

  • Ponteiros são inicializados ao definirmos um endereço para o qual eles devem

apontar.

  • Ponteiros não inicializados são também chamados de “ponteiros selvagens”
  • A não inicialização de ponteiros é um dos principais fatores para erros em tempo de execução em programas escritos na linguagem C. Tais erros são difíceis de identificar e corrigir, porque o tempo decorrido entre o acesso ilegal à memória de um ponteiro e a efetiva ocorrência do erro é imprevisível.

Uma maneira de garantir que um ponteiro declarado não apontará para um lugar qualquer da memória é atribuir o valor NULO para o mesmo.

1int *iptr = NULL;

Comparação de Ponteiros

O ponto importante a respeito da comparação de ponteiros a ser considerado diz respeito a semântica da comparação. Como ponteiros são variáveis que contém endereços de memória, ao compararmos ponteiros o que estamos fazendo realmente é verificando se dois endereços de memória são idênticos ou não.

A primeira vista, tal tipo de comparação pode parecer de pouca importância, no entanto ela será de grande valor futuramente quando ponteiros forem utilizados para manipular estruturas de dados complexas tal como listas ligadas ou árvores.

Podemos comparar se dois ponteiros são iguais menores ou maiores exatamente como se compararam valores de variáveis.

1int vet[7]; 
2int *iptr1, *iptr2; 
3iptr1 = &vet[0]; 
4iptr2 = &vet[6]; 
5iptr1 == iptr2; 
6iptr1 <  iptr2; 
7iptr1 >  iptr2; 
8iptr1 <= iptr2;

Lista de Exercícios

1. O que há de errado com o programa abaixo? Como poderíamos corrigi-lo?

1void main( void ) { 
2  int x, *p; 
3  x = 10; 
4  *p = x; 
5}

2. Seja o seguinte trecho de programa:

1int i = 3, j = 5; 
2int *p, *q; 
3p = &i; 
4q = &j;

Qual será o valor das seguintes expressões:

a) p==&i;

b) *p - *q;

c) &p==&i;

d) 3* *p/(*q)+7

3. Explique o programa abaixo. Encontre o erro, corrija-o para que o mesmo escreva o número 10 na tela.

1#include <stdio.h> 
2
3int main( void ) { 
4	int x, *p, **q; 
5	p = &x; 
6	q = &p; 
7	x = 10; 
8	printf(%d\n, &q); 
9}