Upload
vuongmien
View
215
Download
0
Embed Size (px)
Citation preview
Laboratório de Programação II
Aula 05 Prof. Diemesleno Souza [email protected]://www.diemesleno.com.br
Na aula passada vimos...
Na aula passada vimos...
04 – Matrizes e strings;
Na aula de hoje veremos...
Na aula de hoje veremos...
05 – Ponteiros;
Ponteiros
Ponteiros
A linguagem C é altamente dependente dos ponteiros.
Para ser um bom programador em C é fundamental que se tenha um bom domínio deles.
Ponteiros
Como funcionam os ponteiros?
Ponteiros
Como funcionam os ponteiros?
Os ints guardam inteiros.
Os floats guardam números de ponto flutuante.
Os chars guardam caracteres.
Ponteiros guardam endereços de memória.
Ponteiros
No C quando declaramos ponteiros, nós informamos ao compilador para que tipo de variável vamos apontá-lo.
Um ponteiro int aponta para um inteiro, isto é, guarda o endereço de memória de um inteiro.
Ponteiros
Declarando e utilizando ponteiros
Ponteiros
Declarando e utilizando ponteiros
A forma geral para declarar um ponteiro é:
tipo_do_ponteiro *nome_da_variável;
Ponteiros
Declarando e utilizando ponteiros
A forma geral para declarar um ponteiro é:
tipo_do_ponteiro *nome_da_variável;
É o asterisco (*) que faz o compilador saber que aquela variável não vai guardar valor mas sim um endereço de memória para aquele tipo especificado.
Ponteiros
Declarando e utilizando ponteiros
A forma geral para declarar um ponteiro é:
tipo_do_ponteiro *nome_da_variável;
É o asterisco (*) que faz o compilador saber que aquela variável não vai guardar valor mas sim um endereço de memória para aquele tipo especificado.
int *pont1;
char *temp, *pont2;
Ponteiros
Declarando e utilizando ponteiros
A forma geral para declarar um ponteiro é:
int *pont1;
char *temp, *pont2;
Eles ainda não foram inicializados, pois estão somente declarados; Isso significa que eles apontam para um lugar indefinido na memória.
Ponteiros
Declarando e utilizando ponteiros
A forma geral para declarar um ponteiro é:
int *pont1;
char *temp, *pont2;
Eles ainda não foram inicializados, pois estão somente declarados; Isso significa que eles apontam para um lugar indefinido na memória.
Este lugar pode estar, por exemplo, na porção da memória reservada ao sistema operacional do computador. Usar o ponteiro nestas circunstâncias pode levar a um travamento por exemplo.
Ponteiros
Declarando e utilizando ponteiros
A forma geral para declarar um ponteiro é:
int *pont1;
char *temp, *pont2;
Portanto, é muito importante que um ponteiro seja inicializado (apontado para algum lugar conhecido) antes de ser usado.
Ponteiros
Declarando e utilizando ponteiros
A forma geral para declarar um ponteiro é:
int *pont1;
char *temp, *pont2;
Para inicializar um ponteiro, basta igualá-lo a uma variável já declarada no programa juntamente com o caractere &
Ponteiros
Declarando e utilizando ponteiros
A forma geral para declarar um ponteiro é:
int *pont1;
char *temp, *pont2;
Para inicializar um ponteiro, basta igualá-lo a uma variável já declarada no programa juntamente com o caractere &
int contador = 10;
pont1 = &contador;
Ponteiros
Declarando e utilizando ponteiros
A forma geral para declarar um ponteiro é:
int *pont1;
char *temp, *pont2;
Para inicializar um ponteiro, basta igualá-lo a uma variável já declarada no programa juntamente com o caractere &
int contador = 10;
pont1 = &contador;
Ponteiros
Declarando e utilizando ponteiros
A forma geral para declarar um ponteiro é:
int *pont1;
char *temp, *pont2;
Para inicializar um ponteiro, basta igualá-lo a uma variável já declarada no programa juntamente com o caractere &
int contador = 10;
pont1 = &contador;
Criamos um ponteiro para um inteiro 'pont1' e um inteiro 'contador' inicializado com o valor 10.
A expressão &contador nos dá o endereço de 'contador' na memória, o qual armazenamos em 'pont1'.
Ponteiros
Declarando e utilizando ponteiros
A forma geral para declarar um ponteiro é:
int *pont1;
int contador = 10;
pont1 = &contador;
A partir do momento que nós colocamos um endereço no nosso ponteiro 'pont1', ele está agora pronto para ser utilizado.
Ponteiros
Declarando e utilizando ponteiros
A forma geral para declarar um ponteiro é:
int *pont1;
int contador = 10;
pont1 = &contador;
Podemos, por exemplo, alterar o valor de 'contador' usando o ponteiro 'pont1'.
Para isso, bastamos alterar o valor utilizando o próprio ponteiro juntamente com o caractere '*'.
Ponteiros
Declarando e utilizando ponteiros
A forma geral para declarar um ponteiro é:
int *pont1;
int contador = 10;
pont1 = &contador;
*pont1 = 12;Podemos, por exemplo, alterar o valor de 'contador' usando o ponteiro 'pont1'.
Para isso, bastamos alterar o valor utilizando o próprio ponteiro juntamente com o caractere '*'.
Ponteiros
Declarando e utilizando ponteiros
A forma geral para declarar um ponteiro é:
int *pont1;
int contador = 10;
pont1 = &contador;
*pont1 = 12;
Agora, a variável 'contador'que antes valia 10 agoravale 12.
Ponteiros
Crie o programa61.c
Ponteiros
Digite o seguinte código:
Ponteiros
Compilado e rodando...
Ponteiros
Entendendo o código:
Ponteiros
Crie o programa62.c
Ponteiros
Digite o seguinte código:
Ponteiros
Compilando e rodando...
Ponteiros
Entendendo o código:
Ponteiros
Podemos realizar operações aritméticas com ponteiros.
Podemos por exemplo, igualar dois ponteiros. Se temos dois ponteiros p1 e p2 podemos igualá-los fazendo:
p1 = p2;
Desta forma estamos fazendo com que o ponteiro p1 aponte para o mesmo lugar (na memória) que p2.
Ponteiros
Crie o programa63.c
Ponteiros
Digite o seguinte código:
Ponteiros
Compilado e rodando...
Ponteiros
Compilado e rodando...
Repare que não somente o endereço de memória foi atribuído ao ponteiro 1 mas também o valor que o mesmo guardava.
Ponteiros
Entendendo o código:
Ponteiros
Crie o programa64.c
Ponteiros
Digite o seguinte código:
Ponteiros
Compilado e rodando...
Ponteiros
Compilado e rodando...
Repare que agora somente o valor foiatribuído. O endereço de memória continua o mesmo.
Ponteiros
Entendendo o código:
Ponteiros
Incremento e decremento de ponteiros
Ponteiros
Incremento e decremento de ponteiros
Quando incrementamos um ponteiro, ele passa a apontar para o próximo valor do mesmo tipo para o qual o ponteiro aponta.
Isto é, se temos um ponteiro para um inteiro e o incrementamos ele passa a apontar para o próximo inteiro da memória.
Se você incrementa um ponteiro char* ele anda 1 byte ne memória e se você incrementa um ponteiro double* ele anda 8 bytes na memória.
O decremento funciona semelhante.
Ponteiros
Crie o programa65.c
Ponteiros
Digite o seguinte código:
Ponteiros
Digite o seguinte código:
Ponteiros
Digite o seguinte código:
Repare que incrementamos o ponteiro para que ele aponte para o próximo inteiro e não o valor que ele tinha.
Ponteiros
Entendendo o código:
Ponteiros
Crie o programa66.c
Ponteiros
Digite o seguinte código:
Ponteiros
Compilado e rodando...
Ponteiros
Compilado e rodando...
Repare que agora sim, incrementamos apenas o valor que estava no ponteiro.
Ponteiros
Entendendo o código:
Ponteiros
Ponteiros e vetores
Ponteiros
Ponteiros e vetores têm uma ligação muito forte.
Quando você declara uma matriz da seguinte forma:
tipo_da_variável nome_da_variável[tam1][tam2];
o compilador C calcula o tamanho, em bytes, necessário para armazenar esta matriz. Este tamanho é:
tam1 x tam2 x tamanho_do_tipo
O compilador então aloca este número de bytes em um espaço livre de memória. O nome da variável que você declarou é na verdade um ponteiro para o tipo da variável da matriz.
Ponteiros
tipo_da_variável nome_da_variável[tam1][tam2];
o compilador C calcula o tamanho, em bytes, necessário para armazenar esta matriz. Este tamanho é:
tam1 x tam2 x tamanho_do_tipo
O compilador então aloca este número de bytes em um espaço livre de memória. O nome da variável que você declarou é na verdade um ponteiro para o tipo da variável da matriz.
Tendo alocado na memória o espaço para a matriz, ele toma o nome da variável (que é um ponteiro) e aponta para o primeiro elemento da matriz.
Ponteiros
tipo_da_variável nome_da_variável[tam1][tam2];
o compilador C calcula o tamanho, em bytes, necessário para armazenar esta matriz. Este tamanho é:
tam1 x tam2 x tamanho_do_tipo
O compilador então aloca este número de bytes em um espaço livre de memória. O nome da variável que você declarou é na verdade um ponteiro para o tipo da variável da matriz.
Tendo alocado na memória o espaço para a matriz, ele toma o nome da variável (que é um ponteiro) e aponta para o primeiro elemento da matriz.
nome_da_variável[índice];
Ponteiros
tipo_da_variável nome_da_variável[tam1][tam2];
o compilador C calcula o tamanho, em bytes, necessário para armazenar esta matriz. Este tamanho é:
tam1 x tam2 x tamanho_do_tipo
O compilador então aloca este número de bytes em um espaço livre de memória. O nome da variável que você declarou é na verdade um ponteiro para o tipo da variável da matriz.
Tendo alocado na memória o espaço para a matriz, ele toma o nome da variável (que é um ponteiro) e aponta para o primeiro elemento da matriz.
nome_da_variável[índice];*(nome_da_variável+índice);
Ponteiros
Crie o programa67.c
Ponteiros
Crie o programa67.c
Ponteiros
Compilado e rodando...
Ponteiros
Entendendo o código:
Ponteiros
Desta forma podemos entender como funciona um vetor. Sabendo que:
int nome_da_variável[5];
*nome_da_variável é o mesmo que nome_da_variável[0];
O ponteiro sem índice aponta sempre para o primeiro elemento.
Ponteiros
Agora também entendemos o que ocorreu no nosso programa42.c
Ponteiros
Agora também entendemos o que ocorreu no nosso programa42.c
Ponteiros
Agora também entendemos o que ocorreu no nosso programa42.c
O ponteiro não sabe o tamanho do vetor. Ele apenasaloca a memória, ajusta o ponteiro para o início do mesmo e quando utilizamos os índices, encontra oselementos requisitados, estando ou não dentro do vetor.
Ponteiros
Ponteiros como vetores
Ponteiros
Ponteiros como vetores
Sabemos agora que, na verdade, o nome de um vetor é um ponteiro constante. Sabemos também que podemos indexar o nome de um vetor.
Como consequência podemos também indexar um ponteiro qualquer.
Ponteiros
Crie o programa68.c
Ponteiros
Digite o seguinte código:
Ponteiros
Compilado e rodando...
Ponteiros
Entendendo o código:
Ponteiros
Desta forma, como strings são vetores de caracteres (char*), podemos escrever uma função que faça o mesmo que a já conhecida:
strcpy(string_destino, string_origem);
Ponteiros
Crie o programa69.c
Ponteiros
Digite o seguinte código:
Ponteiros
Digite o seguinte código:
Ponteiros
Entendendo o código:
Ponteiros
Vetores de ponteiros
Ponteiros
Vetores de ponteiros
Podemos construir vetores de ponteiros como declaramos vetores de qualquer outro tipo.
A forma geral para se declarar um vetor de ponteiros é:
int *pmatrix[10];
No exemplo acima, estamos declarando um vetor de ponteiros do tipo int para armazenar 10 ponteiros.
Ponteiros
Cuidados a serem tomados ao se usar ponteiros
Ponteiros
Cuidados a serem tomados ao se usar ponteiros
Os principais cuidados ao se usar um ponteiro devem ser:
1 - Saber sempre para onde o ponteiro está apontando;2 - Nunca utilizar um ponteiro que não foi inicializado;3 - Saber utilizar os caracteres * e &;
Ponteiros
Resumo
Ponteiros
Resumo
- Para declararmos um ponteiro fazemos:tipo *pont;
- Para inicializarmos um ponteiro fazemos:pont = &variavel;
- Para imprimirmos endereço de memória do ponteiro fazemos:printf("%p", pont);
- Para imprimirmos o valor que está no ponteiro fazemos:printf("%tipo", *pont);
- Para alterarmos o valor que está em um ponteiro fazemos:*pont = novo_valor;
- Para colocarmos 2 ponteiros apontando para o mesmo local:pont1 = pont2;
- Para colocarmos 2 ponteiros com o mesmo valor fazemos:*pont1 = *pont2;
Ponteiros
Resumo
- Para incrementarmos um ponteiro fazemos:pont1++; //incrementa o local de memória para o próximo
- Para incrementarmos o valor que está em um ponteiro fazemos:(*pont1)++;
- Para imprimirmos o valor de um vetor como ponteiro fazemos:printf("%tipo", *(vetor+indice));
Laboratório de Programação II
Aula 05 Prof. Diemesleno Souza [email protected]://www.diemesleno.com.br
Exercícios 1
1) Crie um programa com 2 funções que tenham o mesmo comportamento das funções strlen() e strcat() da biblioteca string.h
OBS: Assim como fizemos o programa69.c onde tinha a função strcpy() que tem o mesmo comportamento da função strcpy() da biblioteca string.h