Baixe o app para aproveitar ainda mais
Prévia do material em texto
Introdução Ponteiros e vetores em C Exercícios Considerações finais Ponteiros Prof. DSc. Newton Spolaôr Disciplina Computação I Bacharelado em Ciência da Computação Universidade Estadual do Oeste do Paraná (UNIOESTE) Brasil 01/09/2016 Introdução Ponteiros e vetores em C Exercícios Considerações finais Sumário 1 Introdução 2 Ponteiros e vetores em C 3 Exercícios 4 Considerações finais Newton Spolaôr Ponteiros 2 Introdução Ponteiros e vetores em C Exercícios Considerações finais Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula Aula anterior em um breve olhar Na aula anterior foram abordadas estruturas de controle em C Estruturas condicionais if e switch ... case Estruturas de repetição for e while Nesta aula são apresentados conceitos iniciais referentes ao tipo de dados ponteiro Newton Spolaôr Ponteiros 3 Introdução Ponteiros e vetores em C Exercícios Considerações finais Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula Motivação para ponteiros [1] Uma variável do tipo ponteiro é capaz de armazenar um endereço de memória Para começar a falar sobre a importância de ponteiros, imagine que a memória seja uma sequência de caixas, em que cada caixa pode armazenar um dado Figura: Representação de memória como sequência de 12 caixas Newton Spolaôr Ponteiros 4 Introdução Ponteiros e vetores em C Exercícios Considerações finais Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula Motivação para ponteiros [1] Uma variável do tipo ponteiro é capaz de armazenar um endereço de memória Para começar a falar sobre a importância de ponteiros, imagine que a memória seja uma sequência de caixas, em que cada caixa pode armazenar um dado Figura: Cada caixa pode ser associada a um endereço de memória Newton Spolaôr Ponteiros 5 Introdução Ponteiros e vetores em C Exercícios Considerações finais Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula Exemplo de programa em C [1] #include <stdio.h> int main() { int x; x = 10; int y = x + 6; printf("%d",x); //escrita de um inteiro return 0; } Qual é o valor impresso na tela? Newton Spolaôr Ponteiros 6 Introdução Ponteiros e vetores em C Exercícios Considerações finais Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula Motivação para ponteiros [1] Como x poderia ser lido do teclado? Resposta: scanf("%d",&x); Newton Spolaôr Ponteiros 7 Introdução Ponteiros e vetores em C Exercícios Considerações finais Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula Motivação para ponteiros [1] Como x poderia ser lido do teclado? Resposta: scanf("%d",&x); Newton Spolaôr Ponteiros 7 Introdução Ponteiros e vetores em C Exercícios Considerações finais Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula Motivação para ponteiros [1] A função scanf pra leitura de dados será abordado em aula futura Por ora, convém destacar que ela permite ler um dado do teclado para x , sendo x um parâmetro passado por referência Em C, é necessário indicar explicitamente o endereço de um parâmetro passado por referência (no Pascal, não era necessário) Para tanto, deve-se adicionar o & antes de x para obter o endereço de x No futuro também falaremos sobre passagem de parâmetro por referência em C Newton Spolaôr Ponteiros 8 Introdução Ponteiros e vetores em C Exercícios Considerações finais Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula Motivação para ponteiros [1] A função scanf pra leitura de dados será abordado em aula futura Por ora, convém destacar que ela permite ler um dado do teclado para x , sendo x um parâmetro passado por referência Em C, é necessário indicar explicitamente o endereço de um parâmetro passado por referência (no Pascal, não era necessário) Para tanto, deve-se adicionar o & antes de x para obter o endereço de x No futuro também falaremos sobre passagem de parâmetro por referência em C Newton Spolaôr Ponteiros 8 Introdução Ponteiros e vetores em C Exercícios Considerações finais Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula Motivação para ponteiros [1] A função scanf pra leitura de dados será abordado em aula futura Por ora, convém destacar que ela permite ler um dado do teclado para x , sendo x um parâmetro passado por referência Em C, é necessário indicar explicitamente o endereço de um parâmetro passado por referência (no Pascal, não era necessário) Para tanto, deve-se adicionar o & antes de x para obter o endereço de x No futuro também falaremos sobre passagem de parâmetro por referência em C Newton Spolaôr Ponteiros 8 Introdução Ponteiros e vetores em C Exercícios Considerações finais Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula Motivação para ponteiros [1] A função scanf pra leitura de dados será abordado em aula futura Por ora, convém destacar que ela permite ler um dado do teclado para x , sendo x um parâmetro passado por referência Em C, é necessário indicar explicitamente o endereço de um parâmetro passado por referência (no Pascal, não era necessário) Para tanto, deve-se adicionar o & antes de x para obter o endereço de x No futuro também falaremos sobre passagem de parâmetro por referência em C Newton Spolaôr Ponteiros 8 Introdução Ponteiros e vetores em C Exercícios Considerações finais Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula Motivação para ponteiros [1] A função scanf pra leitura de dados será abordado em aula futura Por ora, convém destacar que ela permite ler um dado do teclado para x , sendo x um parâmetro passado por referência Em C, é necessário indicar explicitamente o endereço de um parâmetro passado por referência (no Pascal, não era necessário) Para tanto, deve-se adicionar o & antes de x para obter o endereço de x No futuro também falaremos sobre passagem de parâmetro por referência em C Newton Spolaôr Ponteiros 8 Introdução Ponteiros e vetores em C Exercícios Considerações finais Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula Motivação para ponteiros [1] Por ora, destaca-se que a função scanf vai receber o valor 4 como endereço de x Newton Spolaôr Ponteiros 9 Introdução Ponteiros e vetores em C Exercícios Considerações finais Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula Ponteiros em C [1] Como mencionado, um ponteiro é uma variável que contém (armazena) um endereço de memória Declaração tipo_dado_apontado * nome_variável; Obs.: o uso do asterisco é obrigatório para declarar uma variável ponteiro Exemplo int x; int *px; //px é um ponteiro para um inteiro Newton Spolaôr Ponteiros 10 Introdução Ponteiros e vetores em C Exercícios Considerações finais Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula Ponteiros em C [1] Como mencionado, um ponteiro é uma variável que contém (armazena) um endereço de memória Declaração tipo_dado_apontado * nome_variável; Obs.: o uso do asterisco é obrigatório para declarar uma variável ponteiro Exemplo int x; int *px; //px é um ponteiro para um inteiro Newton Spolaôr Ponteiros 10 Introdução Ponteiros e vetores em C Exercícios Considerações finais Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula O que é um ponteiro? [1] #include <stdio.h> int main() { int y; int x=10; int *px; px = &x; printf("&xpossui %p e px possui %p",&x,px); return 0; } O que é impresso na tela? Newton Spolaôr Ponteiros 11 Introdução Ponteiros e vetores em C Exercícios Considerações finais Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula O que é um ponteiro? [1] Nesse cenário, deveria ser impresso na tela o seguinte &x possui 0x4 e px possui 0x4 Newton Spolaôr Ponteiros 12 Introdução Ponteiros e vetores em C Exercícios Considerações finais Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula O que é um ponteiro? [1] Para receber o dado apontado pelo ponteiro, é necessário usar o operador * Exemplo: y = *px; //y é uma variável int Newton Spolaôr Ponteiros 13 Introdução Ponteiros e vetores em C Exercícios Considerações finais Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula O que é um ponteiro? [1] Figura: Note que y agora contém o mesmo dado que x , graças ao ponteiro px Newton Spolaôr Ponteiros 14 Introdução Ponteiros e vetores em C Exercícios Considerações finais Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula Usando um ponteiro [1] #include <stdio.h> int main() { int x = 10; int *px; px = &x; // *px é igual a 10 (*px)++; // *px é igual a 11 printf("%d" , x); //escreve 11 return 0; } Após a atribuição px = &x;, ao alterar *px mudamos também o conteúdo de x Newton Spolaôr Ponteiros 15 Introdução Ponteiros e vetores em C Exercícios Considerações finais Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula Usando um ponteiro [1] #include <stdio.h> int main() { int x = 10; int *px, *px2; px = &x; // *px é igual a 10 px2 = px;// *px2 é igual a 10 (*px)++; // *px, *px2 e x são iguais a 11 (*px2)++;// *px, *px2 e x são iguais a 12 printf("%d" , x); //escreve 12 return 0; } Newton Spolaôr Ponteiros 16 Introdução Ponteiros e vetores em C Exercícios Considerações finais Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula Usando um ponteiro [2] #include <stdio.h> int main() { int x; int *px; x = 1; *px = 1; printf("%d" , *px); return 0; } Há algum possível problema nesse código? Sim, pois px não aponta para um local válido de memória Newton Spolaôr Ponteiros 17 Introdução Ponteiros e vetores em C Exercícios Considerações finais Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula Usando um ponteiro [2] #include <stdio.h> int main() { int x; int *px; x = 1; *px = 1; printf("%d" , *px); return 0; } Há algum possível problema nesse código? Sim, pois px não aponta para um local válido de memória Newton Spolaôr Ponteiros 17 Introdução Ponteiros e vetores em C Exercícios Considerações finais Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula Usando um ponteiro [2] #include <stdio.h> int main() { int x; int *px; x = 1; *px = 1; printf("%d" , *px); return 0; } Uma representação gráfica ajuda a entender isso A seguir, uma possível solução é apresentada Newton Spolaôr Ponteiros 18 Introdução Ponteiros e vetores em C Exercícios Considerações finais Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula Usando um ponteiro [2] #include <stdio.h> int main() { int x; int *px; //px não aponta para local válido x = 1; px = &x; //px agora aponta para x *px = 1; //local apontado por px recebe 1 printf("%d" , *px); //imprime 1 return 0; } Newton Spolaôr Ponteiros 19 Introdução Ponteiros e vetores em C Exercícios Considerações finais Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula Objetivo desta aula Apresentar ponteiros em C Newton Spolaôr Ponteiros 20 Introdução Ponteiros e vetores em C Exercícios Considerações finais Ponteiros e vetores Sumário 1 Introdução 2 Ponteiros e vetores em C 3 Exercícios 4 Considerações finais Newton Spolaôr Ponteiros 21 Introdução Ponteiros e vetores em C Exercícios Considerações finais Ponteiros e vetores Ponteiros e vetores em C [1] Para começar a exercitar ponteiros, podemos considerar a relação que eles possuem com vetores O conceito de vetor, já introduzido com Pascal, será desenvolvido em C em aula futura Por ora, é suficiente... Recordar que vetor é uma sequência de elementos do mesmo tipo de dados Saber que a iniciação de um vetor v de 3 reais em C pode ser realizada como ilustrado no código double v [ ] = {1.0, 3.0, 5.75}; Newton Spolaôr Ponteiros 22 Introdução Ponteiros e vetores em C Exercícios Considerações finais Ponteiros e vetores Ponteiro para acessar vetor [1] #include <stdio.h> int main() { double v[] = {1.0,3.0,5.75}; //iniciação de v double *pv; //ponteiro para um double pv = &v[0]; // *pv é igual a 1.0 printf("%lf" , *pv); //escreve 1.0 return 0; } Newton Spolaôr Ponteiros 23 Introdução Ponteiros e vetores em C Exercícios Considerações finais Ponteiros e vetores Ponteiro para acessar vetor [1] Quando um ponteiro é usado para acessar um vetor, é possível também usar colchetes para acessar elementos do vetor Em outras palavras, ... Assim como v[0] indica que estamos acessando o 1o elemento do vetor v ... O código pv[0] indica que estamos acessando o 1o elemento da sequência apontada por pv Newton Spolaôr Ponteiros 24 Introdução Ponteiros e vetores em C Exercícios Considerações finais Ponteiros e vetores Ponteiro para acessar vetor [1] #include <stdio.h> int main() { double v[] = {1.0,3.0,5.75}; //iniciação de v double *pv; //ponteiro para um double pv = &v[0]; // *pv é igual a 1.0 printf("%lf" , pv[0]); //escreve 1.0 return 0; } Como poderíamos acessar o 2o elemento de v usando o ponteiro pv? Newton Spolaôr Ponteiros 25 Introdução Ponteiros e vetores em C Exercícios Considerações finais Sumário 1 Introdução 2 Ponteiros e vetores em C 3 Exercícios 4 Considerações finais Newton Spolaôr Ponteiros 26 Introdução Ponteiros e vetores em C Exercícios Considerações finais Exercício 1 Escolha um dos programas em C já construídos nessa disciplina (se não encontrar, crie um agora) Após, modifique esse programa para imprima na tela o endereço de cada variável utilizada Para escrever o endereço de uma variável x , use a função printf("%p",&x) Quais são os endereços exibidos? Newton Spolaôr Ponteiros 27 Introdução Ponteiros e vetores em C Exercícios Considerações finais Exercício 2 [1] Faça um programa que acha o maior e o menor valor dentro de um vetor de 10 inteiros previamente iniciado Após, imprima na tela o maior e o menor valor usando a função printf("%d",...), em que ... é substituído por cada um dos ponteiros Obs.: Para esse exercício, use somente as variáveis... int v[10], i; int *maior, *menor; Newton Spolaôr Ponteiros 28 Introdução Ponteiros e vetores em C Exercícios Considerações finais Exercício 3 Crie um programa que, a partir de um vetor de 5 reais previamente iniciado, realize as seguintes operações Dobrar cada elemento do vetor A partir do vetor anterior, some mais uma unidade para cada elemento Para acessar os elementos do vetor, use somente ponteiros para exercitá-los Newton Spolaôr Ponteiros 29 Introdução Ponteiros e vetores em C Exercícios Considerações finais Considerações finais 1 Introdução 2 Ponteiros e vetores em C 3 Exercícios 4 Considerações finais Newton Spolaôr Ponteiros 30 Introdução Ponteiros e vetores em C Exercícios Considerações finais Considerações finais Nesta aula foi apresentado o conceitode ponteiro, um endereço de memória Esse conceito será ainda explorado no futuro, por exemplo, para passagem de parâmetros por referência e para alocação dinâmica de dados Na próxima aula, vamos abordar uma função que necessita de um endereço de memória como parâmetro: scanf Newton Spolaôr Ponteiros 31 Introdução Ponteiros e vetores em C Exercícios Considerações finais Contato newtonsp.unioeste@gmail.com Newton Spolaôr Ponteiros 32 Referências [1] Denis F. Wolf. Algoritmos. http://wiki.icmc.usp.br/index.php/Scc-101, 2014. Notas didáticas. [2] Stackoverflow. Can’t assign values to variable and pointer [duplicate]. http://stackoverflow.com/questions/11297576/cant-assign- values-to-variable-and-pointer, 2012. Newton Spolaôr Ponteiros 32 Introdução Aula anterior em um breve olhar Motivação para ponteiros Objetivo desta aula Ponteiros e vetores em C Ponteiros e vetores Exercícios Considerações finais
Compartilhar