Ponteiros
Resenha: Ponteiros. Pesquise 861.000+ trabalhos acadêmicosPor: jaisonpereira • 25/5/2014 • Resenha • 1.063 Palavras (5 Páginas) • 321 Visualizações
Etapa 3
Passo 2
Os conceitos de endereço e ponteiro são fundamentais em qualquer linguagem de programação (embora sejam mais visíveis em C que em outras linguagens). O conceito de ponteiro é muito útil mas difícil; seu domínio exige um certo esforço.
Endereços
A memória de qualquer computador é uma sequência de bytes. Cada byte armazena um de 256 possíveis valores. Os bytes são numerados sequencialmente. O número de um byte é o seu endereço (= address).
Cada objeto na memória do computador ocupa um certo número de bytes consecutivos. No meu computador, um char ocupa 1 byte, um int ocupa 4 bytes e um double ocupa 8 bytes
Cada objeto na memória do computador tem um endereço. Na maioria dos computadores, o endereço de um objeto é o endereço do seu primeiro byte. Por exemplo, depois das declarações
char c;
int i;
struct {
int x, y;
} ponto;
int v[4];
os endereços das variáveis poderiam ser
c 89421
i 89422
ponto 89426
v[0] 89434
v[1] 89438
v[2] 89442
(o exemplo é fictício). O endereço de uma variável é dado pelo operador &. (Não confunda esse uso de "&" com o operador lógico and, que em C se escreve "&&".) Se i é uma variável então &i é o seu endereço. No exemplo acima, &i vale 89422 e &v[3] vale 89446.
Exemplo: O segundo argumento da função de biblioteca scanf é o endereço da posição na memória onde devem ser depositados os objetos lidos no dispositivo padrão de entrada:
int i;
scanf( "%d", &i);
Ponteiros
Um ponteiro (= apontador = pointer) é um tipo especial de variável que armazena endereços. Um ponteiro pode ter o valor especial
NULL
que não é o endereço de lugar algum. A constante NULL está definida no arquivo-interface stdlib e seu valor é 0 na maioria dos computadores.
Se um ponteiro p armazena o endereço de uma variável i, podemos dizer "p aponta para i" ou "p é o endereço de i" (querendo dizer "o ponteiro p aponta para i" no primeiro caso e "o valor de p é o endereço de i" no segundo). Se um ponteiro p tem valor diferente de NULL então
*p
é o valor do objeto apontado por p. (Não confunda esse uso de "*" com o operador de multiplicação!) Por exemplo, se i é uma variável e p é igual a &i então dizer "*p" é o mesmo que dizer "i".
Figura esquerda: um ponteiro p, armazenado no endereço 90001, contém o endereço de um inteiro. Figura direita: representação esquemática da situação.
Há vários tipos de ponteiros: ponteiros para caracteres, ponteiros para inteiros, ponteiros para ponteiros para inteiros, ponteiros para registros etc. O computador faz questão de saber de que tipo de ponteiro você está falando. Para declarar um ponteiro p para um inteiro, diga
int *p;
Para declarar um ponteiro p para um registro cel, diga
struct cel *p;
Um ponteiro r para um ponteiro que apontará um inteiro é declarado assim:
int **r;
Exemplos
Suponha que a, b e c são variáveis inteiras. Eis um jeito bobo de fazer "c = a+b":
int *p; /* p é um ponteiro para um inteiro */
int *q;
p = &a; /* o valor de p é o endereço de a */
q = &b; /* q aponta para b */
c = *p + *q;
Outro exemplo bobo:
int *p;
int **r; /* r é um ponteiro para um ponteiro para um inteiro */
p = &a; /* p aponta para a */
r
...