Baixe o app para aproveitar ainda mais
Prévia do material em texto
Aritmética dos Ponteiros Recordando... Op Significado &p Endereço do ponteiro na memória *p Conteúdo da área referenciada pelo ponteiro p++ p-- Incrementa/decrementa o ponteiro p == q Verifica se os ponteiros p e q apontam para a mesma área de memória p = q O ponteiro da esquerda aponta para o mesmo local que o da direita Aritmética dos ponteiros Exemplo 1: // Suponha que &x = 0xFFFA e &y = 0xFFC0 int x=10, y=20, px=&x, py=&y; if (px == py)... // falso, 0xFFFA≠0xFFC0 px = py; // px terá 0xFFC0 px++; /* px terá 0xFFC2 (inteiro ocupa 2 bytes)*/ px++; // px terá 0xFFC4 Aritmética dos ponteiros Exemplo 2: // Suponha que &x = 0xF000 float x=10.0, *px=&x; px++; /* px terá 0xF004 (float ocupa 4 bytes)*/ px++; // px terá 0xF008 Exercícios 1) V ou F: ao passar um valor para uma função, o endereço deste valor é passado para os parâmetros da função? Falso, uma cópia do valor é que é passado 2) Qual a maneira correta de referenciar ch, assumindo que o endereço de ch é o conteúdo do ponteiro p? a) *p d) *ch b) int *p e) &p c) ch f) &ch Exercícios (3) Assumindo que o endereço da variável var foi atribuído a um ponteiro pv, escreva uma expressão que divida o valor de var por 5 usando apenas o ponteiro pv. *pv = *pv / 5; (4) Na expressão float *fptr; float é o tipo: a) da variável fptr b) do endereço de fptr c) da variável apontada por fptr d) nenhuma das anteriores Exercícios (5) O que deve ser modificado no programa seguinte para que ele funcione? main() { int j, *ptrj; *ptrj = 3; } Resp: ptrj = &j; deve ser incluído antes de *ptrj = 3; Exercícios (6) Assumindo que queremos ler o valor de x, e o endereço de x foi atribuído a ptrx, a instrução seguinte é correta? Se não for, corrija-a. scanf("%d", *ptrx); Resp: Não! O correto é scanf("%d", ptrx); Ponteiros e vetores (recordando) O identificador do vetor é um ponteiro – Exemplo: float v[ ] = {1.3,2.2,3.1,8.4}; – v é uma constante que endereça o primeiro elemento do vetor. &v[0] e v são iguais: acessam o mesmo endereço de memória v[0] e *v são iguais: acessam o conteúdo da mesma posição de memória. – v[i] é igual a: *(v + i) Ponteiros e vetores (recordando) Exemplo: int x[] = {10,20,30,40}; /* x é a mesma coisa que &x[0] */ *x = 100; // é o mesmo que x[0] = 100; *(x+1) = 200; // é o mesmo que x[1] = 200; *(x+2) = 300; // é o mesmo que x[2] = 300; Podemos dizer que: x[i] é o mesmo que *(x+i) &x[i] é o mesmo que x+i Programa exemplo /* Programa que imprime os elementos de um vetor na Ordem inversa */ #include<stdio.h> #include<stdlib.h> main() { int vet[ ] = {1,2,3,4,5}; int *pv; pv = vet; // vet é o mesmo que &vet[0] for (int i=4; i>=0; i--) { printf("\n%d", *(pv+i)); } system("PAUSE"); } Ponteiros e vetores O que há de errado no código abaixo? int x[] = {10,20,30,40}; x++; // Para onde aponta x? Resp: x é um ponteiro constante, seu valor não pode ser alterado! Os outros ponteiros são chamados de variáveis int px; px = x; px++; // Correto! Exercícios (1) O que faz o programa abaixo quando executado? main() { int i, *ptr, mat[] = {4, 5, 6}; ptr = mat; for (i=0; i<3 ;i++) { printf("%d ", *ptr); ptr++; } } Resp: Imprime 4, 5 e 6. Exercícios (2) O que faz o programa abaixo quando executado? main() { int i, mat[] = {4, 5, 6}; for (i=0; i<3; i++) printf("%d ",mat+i); } Resp: Imprime os endereços de mat[0], mat[1] e mat[2] Ponteiros para registros Pode-se ter um ponteiro para uma struct struct aluno { char matricula[9]; char nome[30]; int idade; } struct aluno *paluno; O ponteiro paluno aponta para o primeiro byte da struct aluno Ponteiros para registros Uma aplicação prática: passagem de estruturas por referência para funções aluno aluno1; /*declara uma variável */ atualiza_idade(&aluno1, 33); void atualiza_idade(aluno *ptr, int i) { (*ptr).idade = i; // } Atenção: os parêntesis são obrigatórios, senão a interpretação de *ptr.idade seria que ptr.idade é um ponteiro int. Outra forma de fazer a mesma coisa aluno aluno1; /*declara uma variável */ atualiza_idade(&aluno1, 33); void atualiza_idade(aluno *ptr, int i) { ptr->idade = i; // igual a (*ptr).idade } O operador "->" : acessa o conteúdo de um campo da estrutura referenciada pelo ponteiro Aritmética dos Ponteiros Recordando... Aritmética dos ponteiros Aritmética dos ponteiros Exercícios Exercícios Exercícios Exercícios Ponteiros e vetores (recordando) Ponteiros e vetores (recordando) Programa exemplo Ponteiros e vetores Exercícios Exercícios Ponteiros para registros Ponteiros para registros Outra forma de fazer a mesma coisa
Compartilhar