Baixe o app para aproveitar ainda mais
Prévia do material em texto
Programação II Ponteiros Prof. Raphael Vidal Raphaelvidal9.webnode.com Raphael.r.vidal@gmail.com Endereços - Bytes • A memória de qualquer computador é uma sequência de bytes. Os bytes são numerados sequencialmente. O número do byte é o seu endereço (= address). • Endereços - Bytes • Cada objeto na memória do computador ocupa um certo número de bytes consecutivos. Ex: 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. Endereços • Por exemplo: char c; int i; struct { int x, y; } ponto; int v[4]; Depois das declarações, os endereços das variáveis poderiam ser: c 89421 i 89422 ponto 89426 v[0] 89434 v[1] 89438 v[2] 89442 V[3] 89446 (exemplo fictício) Endereços – Operador de endereço • O endereço de uma variável é dado pelo operador &, chamdo de “operador de referência” ou “operador de endereço” (Não confundir 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 anterior, &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); Endereços – Variável de memória • Uma variável de memória está estruturada da seguinte forma: • Exemplo: int c = 10; endereço (left value) valor (right value) 0065FF53 10 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). Ponteiros • 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".(valor de i) • Acima, um ponteiro p, armazenado no endereço 90001, contém o endereço de um inteiro. Em seguida, a representação esquemática da situação. Ponteiros • Há vários tipos de ponteiros: ponteiros para caracteres, ponteiros para inteiros, ponteiros para ponteiros para inteiros, ponteiros para registros etc. • O compilador faz questão de saber de que tipo de ponteiro você está falando: • Para declarar um ponteiro p para um inteiro, faça int *p; • Para declarar um ponteiro p para um registro cel, faça struct cel *p; • Um ponteiro r para um ponteiro que apontará um inteiro é declarado assim: int **r; • É importante citar que todo ponteiro deve ser inicializando antes de ser utilizado para que não aponte para um endereço de memória indesejado ou que esteja sendo utilizado por outro aplicativo. Ponteiro para inteiro - exemplo: • Obs: para exibição de ponteiros (endereços) utilize %p Execução do exemplo anterior Ponteiro para inteiro – exemplo 2 • Exemplos: int main() { int i = 10 ; int *p ; p = &i ; *p = 5 ; //valor inserido em i através de p printf ("%d %d %p", i, *p, p); return 0; } •É de esperar que os valores de i e de *p sejam iguais, já que p aponta para i. O terceiro valor é o endereço de memória onde está i (e, consequentemente, é o próprio valor de p), que será diferente em cada sistema. Ponteiros para registros Obs: para acessar as variáveis do registro utilize: -> (seta) Ponteiros para Vetores • Em C, os elementos de um vetor são sempre guardados sequencialmente, a uma distância fixa um do outro. Com isso, é possível facilmente passar de um elemento a outro, percorrendo sempre uma mesma distância para frente ou para trás na memória. Dessa maneira, podemos usar ponteiros e a aritmética de ponteiros para percorrer vetores. • Na verdade, vetores são ponteiros ― um uso particular dos ponteiros. Ponteiros para Vetores • Exemplo: Ponteiros para Vetores • Entendendo o código anterior: • Começamos declarando um vetor com três elementos; • Depois, criamos um ponteiro para esse vetor. Mas repare que não colocamos o operador de endereço em vetorTeste. Fazemos isso porque um vetor já representa um endereço, como pode-se verificar pelo resultado da primeira chamada a printf(). • Se o ponteiro aponta para o vetor, o próximo inteiro na memória será o próximo elemento do vetor! • De fato, em C as duas formas *(ptr+n) e ptr[n] são equivalentes. Ponteiros para Vetores • Entendendo o código anterior: • Não é necessário criar um ponteiro para usar essa sintaxe. Como já vimos, o vetor em si já é um ponteiro, de modo que qualquer operação com ptr será feita igualmente com vetorTeste. Todas as formas abaixo de acessar o segundo elemento do vetor são equivalentes: vetorTeste[1]; *(vetorTeste + 1); ptr[1]; *(ptr + 1); Ponteiros • Ponteiros podem ser utilizados para: • Passagem de parâmetro por referência (End. de memória) • Alocação Dinâmica • Arquivos • Listas encadeadas Resumo • *p = Valor que está no endereço apontado • p = endereço apontado • &p = endereço do ponteiro • p[i] = valor dentro do vetor • &p[i] = endereço da posição do vetor • == apontam para a mesma posição • != apontam para posições diferentes • > >= < <= qual aponta para a posição mais alta Exercício (todas as operações com ponteiros !) 1 - Crie um programa onde receba dois valores inteiros e armazene em variáveis (a, b). Utilize ponteiros para realizar a multiplicação entre eles. O resultado deve ser armazenado em uma variável de nome result. O valor de result deve ser apresentado através de um ponteiro. Todos os endereços das variáveis e ponteiros devem ser demonstradas ao final do programa 2 - Reutilize o programa anterior demonstrando na tela se o valor da variável A é maior que o valor de B. (vice versa) ou se são iguais. 3 – (Utilize Registros) Escrever um programa que cadastre o nome, a matrícula e duas notas de um aluno. Em seguida imprima a matrícula, o nome e a média. Informe também se o aluno foi aprovado ou não.(todas as operações e impressões devem ser feitas com ponteiros) Exercícios 4 - Assumindo que o endereço da variável x foi atribuído a um ponteiro px, escreva uma expressão que não usa x e divida x por 5. 5 - Escreva um programa que simule contas bancárias, com as seguintes especificações: • Ao iniciar o programa vamos criar uma conta bancária. o Cada conta terá o nome e o CPF do cliente associado a ela. o No ato da criação da conta o cliente precisará fazer um depósito inicial. • Após as contas serem criadas, o sistema deverá possibilitar realizações de saques ou depósitos nas contas. o Sempre que uma operação de saque ou depósito seja realizada, o sistema deverá imprimir o nome do titular e o saldo final Obrigado!!!
Compartilhar