Laboratório de Programação II - diemesleno.com.br · A forma geral para se declarar um vetor de...

Preview:

Citation preview

Laboratório de Programação II

Aula 05 Prof. Diemesleno Souza Carvalhodiemesleno@iftm.edu.brhttp://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 Carvalhodiemesleno@iftm.edu.brhttp://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

Recommended