Prévia do material em texto
Ponteiros
• A linguagem C implementa o conceito de ponteiro.
• O ponteiro é um tipo de dado como int, char ou foat. A diferença do ponteiro em
relação aos outros tipos de dados é que uma variável que seja ponteiro
guardará um endereço de memória .
• Por meio deste endereço pode-se acessar a informação, dizendo que a variável
ponteiro aponta para uma posição de memória.
• O maior problema em relação ao ponteiro é entender quando se está
trabalhando com o seu valor, ou seja, o endereço, e quando se está trabalhando
com a informação apontada por ele.
Vetores
• Em diversas situações os tipos básicos de dados (int, float, char, ....) não são
suficientes para representar a informação que se deseja armazenar.
• Exemplo, uma palavra: “AULA”.
• Existe a possibilidade de construção de novos tipos de dados a partir da
composição (ou abstração) de tipos de dados primitivos.
• Esses novos tipos têm um formato denominado ESTRUTURA DE DADOS, que
define como os tipos primitivos estão organizados.
Vetores
Vetores
• Mas se além da média quisesse fazer um programa em C para imprimir as notas
lidas juntamente com a média da turma .
• Quando uma determinada Estrutura de Dados for composta de variáveis com o
mesmo tipo primitivo, temos um conjunto homogêneo de dados.
• Essas variáveis são chamadas de variáveis compostas homogêneas. As variáveis
compostas homogêneas unidimensionais são utilizadas para representar arranjos
unidimensionais de elementos de um mesmo tipo, em outras palavras, são
utilizadas para representar vetores.
Vetores
• sintaxe para declaração de uma variável deste tipo é:
• tipo_primitivo identificador[qtde_elementos];
• Exemplo: int dados[5]; // vetor com 5 (0 a 4) elementos do tipo int
Sempre começará a contar a primeira posição do zero.
Vetores
• Para fornecer os elementos de cada posição do vetor é declarado da seguinte
forma:
Exemplo: float valores[4]={1.2,3.6,4.5,2.8};
Valores
Se fosse float dados[3]={1.2}; ou seja há menos valores do que o número de
elementos do array, os elementos restantes são inicializados automaticamente com
o valor zero.
Vetores
• Importante:
• Os vetores não são inicializados automaticamente.
• Declarar mais elementos do que defino causa erro de sintaxe.
• Omitindo o tamanho do vetor ele terá o mesmo número de elementos digitados.
• int n[ ] = {1, 2, 3, 4, 5}; ou seja 5 elementos,5 posições, índices do
vetor variam de 0 a 4.
Vetores
• Cada um dos elementos de um vetor é referenciado individualmente por meio
de um número inteiro entre colchetes após o nome do vetor.
Valores
X = valores[1]; (8.9)
Y = valores[3]; (4.5)
Vetores
• Ambas as formas atribuem um valor ao elemento 0 (zero) do vetor valores:
i=0;
valores[0] = 6.7;
ou
valores[i]=6.7;
Vetores
• O programa a seguir inicializa os dez elementos de um array s com os valores: 2,
4, 6, ..., 20 e o imprime.
Resultado:
Vetores
• Exercícios:
1- Informar quais são os elementos referenciados pelas expressões a seguir.
2- Qual é a diferença entre os números “4” das duas instruções abaixo ?
int mat[4];
mat[4] = 5;
Vetores
3 - Quais serão os
valores dos
elementos do
vetor x que serão
impressos no final
da execução do
trecho de
programa
seguinte:
Vetores
• Resultado:
Vetores
• Matrizes(vetores multidimensionais):
• Como os vetores, as matrizes são estruturas de dados homogêneas.
• Podem ser construídas dos diversos tipos básicos primitivos (float, int, char).
• A Principal diferença em relação aos vetores (unidimensionais): possui uma ou
mais dimensões adicionais, mas na maioria dos casos: utiliza-se matrizes
bidimensionais.
• São utilizadas quando os dados homogêneos necessitam de uma estruturação
com mais de uma dimensão.
Vetores
• Exemplos:
• Programar um jogo de xadrez (o tabuleiro é naturalmente
bidimensional),estrutura para guardar caracteres de um livro (três dimensões: 2
para representar os caracteres de uma página e uma terceira para indicar as
páginas),problemas matemáticos matriciais.
• A sintaxe para declaração de uma variável deste tipo é semelhante a declaração
dos vetores. Considera-se porém a quantidade de elementos da outra dimensão:
tipo_primitivo identificador[qde_el_linha] [qde_el_col];
Vetores
• Exemplo: int mat[3][2]; {uma matriz de números inteiros com 3 linhas e 2 colunas, essa
matriz possui 6 elementos}
• Neste caso os índices variam de 0 a 2 para linhas e de 0 a 1 para colunas.
• Caso geral:
• tipo_primitivo identificador[dim 1] [dim 2]...[dim n]; matriz n-dimensional Exemplo:
•
• Float mat[2][3][4];
{matriz 2X3X4 do tipo float, esta matriz possui 24 elementos e os índices variam de 0 a 1 para a
primeira dimensão, 0 a 2 para a segunda dimensão e 0 a 3 para a terceira dimensão}
Vetores
• Pode-se fornecer valores de cada elemento de uma matriz na declaração, da
mesma forma que nos vetores.
Exemplo:
float num[2][4] = {{3.6, 2.7},{5.0,4.1},{7.9,9.8}{5.3,2.4},{7.4,2.1}};
• Ou seja, fornece-se os valores linha a linha.
Matriz
• Observações:
As matrizes não são inicializadas automaticamente.
Se houver menos valores do que o número de elementos da matriz, os elementos restantes são
inicializados automaticamente com o valor zero.
int num[5][3] = {{32, 64, 27}};
int n[4][4] = {{0}}; //todos elementos são nulos.
A seguinte declaração causa um erro de sintaxe:
int n[2][5] = {{32, 64, 27, 18, 95, 14},{12,15,43,17,67,31}};
Matriz
• Os elementos das matrizes são referenciados individualmente por meio de
índices (iniciando de zero) entre colchetes
• Exemplos:
int Vetor[5]; // declara um vetor de 5 posições
int Matriz[5][3]; // declara uma matriz de 5 linhas e 3 colunas
Vetor[0] = 9; // coloca 9 na primeira posição do vetor
Vetor[4] = 30 // coloca 30 na última posição do vetor
Matriz[0][1] = 15; // coloca 15 na célula que está na primeira linha
// e na segunda coluna da matriz
Matriz
• Os elementos das matrizes são referenciados individualmente por meio de
índices (iniciando de zero) entre colchetes
• Exemplos:
Dada a matriz acima tem-se:
A = mat[1][2];
B = mat[0][0];
A instrução abaixo atribui um valor ao elemento linha zero e coluna um da matriz
mat: i=0; j=1
mat[0][1] = 15;
ou valores[i][j]=15;
Matriz
• Exercícios: 1- Quais são os elementos do vetor referenciados pelas expressões
abaixo?
Matriz
2- Qual é a diferença entre os números “3” das duas instruções abaixo ?
int mat[6][3];
mat[6][3] = 5
3- A instrução seguinte é correta para inicializar uma matriz ?
int mat[2][2] = {1, 2},{3,4};
Matriz
4- Quais
serão os
valores dos
elementos da
matriz x no
final da
execução do
programa ?
Matriz
Matriz
4- Quais
serão os
valores
dos
element
os da
matriz x
no final
da
execuçã
o do
program
a ?
Matriz
Matriz
• Para passar uma matriz ou vetor como parâmetro, basta declarar o
parâmetro da mesma forma que a matriz/vetor foi declarado.
• Por definição da linguagem C, um vetor é sempre passado por
referência, logo, qualquer alteração em seus elementos, altera a variável
usada como parâmetro na chamada da rotina.
Ponteiros
• Operador & e *
• O primeiro operador de ponteiro é &. Ele é um operador unário que devolve o
endereço na memória de seu operando.
• Por exemplo:
• m = &count; põe o endereço na memória da variável count em m
• Esse endereço é a posição interna da variável na memória do computador e
não tem nenhuma relação com o valor de count.
Ponteiros
• O operador & tem como significado o endereço de.
• O segundo operador é *, que é o complemento de &. O * é um operador unário
que devolve o valor da variável localizada no endereço que o segue.
• Por exemplo:
se m contém o endereço da variável count:
q = *m;
coloca o valor de count em q.
O operador * tem como significado no endereço de.
Ponteiros
• Cuidado para não confundir o operador de ponteiros (*) como
multiplicação na utilização de ponteiros e vice-versa.
• A declaraçãode uma variável ponteiro é dada pela colocação de um
asterisco (*) na frente de uma variável de qualquer tipo.
• Na linguagem C, é possível definir ponteiros para os tipos básicos ou
estruturas. A definição de um ponteiro não reserva espaço de memória
para o seu valor e sim para o seu conteúdo. Antes de utilizar um ponteiro,
o mesmo deve ser inicializado, ou seja, deve ser colocado um endereço
de memória válido para ser acessado posteriormente.
Ponteiros
• Um ponteiro pode ser utilizado de duas maneiras distintas.
1) é trabalhar com o endereço armazenado no ponteiro
2) é trabalhar com a área de memória apontada pelo ponteiro.
• Quando se quiser trabalhar com o endereço armazenado no ponteiro,
utiliza-se o seu nome sem o asterisco na frente. Sendo assim qualquer
operação realizada será feita no endereço do ponteiro.
Ponteiros
• Como, na maioria dos casos, se deseja trabalhar com a memória apontada pelo
ponteiro, alterando ou acessando este valor, deve-se colocar um asterisco antes
do nome do ponteiro.
• Sendo assim, qualquer operação realizada será feita no endereço de memória
apontado pelo ponteiro.
• O programa a seguir demostra a utilização de ponteiros para acesso à memória.
Ponteiros
Resultados:
https://www.onlinegdb.com/online_c_co
mpiler
Ponteiros
• Resultados
Ponteiros
• Resultados:
Ponteiros
• Resultados:
Ponteiros
Passando variáveis para funções por referência
• O ponteiro é utilizado para passar variáveis por referência, ou seja, variáveis que
podem ter seu conteúdo alterado por funções e mantêm este valor após o
término da função.
• Na declaração de uma função, deve-se utilizar o asterisco antes do nome do
parâmetro, indicando que está sendo mudado o valor naquele endereço passado
como parâmetro.
Ponteiros
Um ponteiro normal (int *p) armazena o endereço de uma variável do tipo int.
Um ponteiro de ponteiro (int **pp) armazena o endereço de uma ponteiro (int *)
Ponteiros
Resultado:
Ponteiros
Chamada de função com ponteiros
Ponteiros
• Resultado:
Ponteiros
• Resultado:
Ponteiros
• Resultado:
Malloc
• Exemplos
• Código que aloca 1000 bytes de memória livre:
char *p;
p = malloc(1000);
• Código que aloca espaço para 50 inteiros:
int *p;
p = malloc(50*sizeof(int));
• Obs.: O operador sizeof() retorna o número de bytes de um inteiro.
Malloc
Função básica para alocar memória é
malloc int *vet; vet = malloc(10*4);
Após esses comandos, se a alocação for bem sucedida, vet armazenará o endereço
inicial de uma área contínua de memória suficiente para armazenar 10 valores
inteiros.
Desta forma, consideramos que um inteiro ocupa 4 bytes.
Para ficarmos independentes de compiladores e máquinas, usamos o operador
sizeof( )
v = malloc(10*sizeof(int));
Malloc
• A função malloc é usada para alocar espaço para armazenarmos valores de
qualquer tipo.
• Por este motivo, malloc retorna um ponteiro genérico, para um tipo qualquer,
representado por void* , que pode ser convertido automaticamente pela
linguagem para o tipo apropriado na atribuição.
• No entanto, é comum fazermos a conversão explicitamente, utilizando o
operador de molde de tipo (cast).
• Então:
v = (int *) malloc(10*sizeof(int));
Malloc
• Se não houver espaço livre suficiente para realizar a alocação, a função retorna
um endereço nulo (representado pelo símbolo NULL , definido em stdlib.h).
• Podemos tratar o erro na alocação do programa verificando o valor de retorno
da função malloc
• Ex: imprimindo mensagem e abortando o programa com a função exit, também
definida na stdlib.
Int * v;
v = (int*) malloc(10*sizeof(int));
if (v==NULL) { printf("Memoria insuficiente.\n");
exit(1); /* aborta o programa e retorna 1 para o sist. operacional */
Malloc
Malloc
• toda memória não mais utilizada deve ser liberada através da função free():
Ponteiros
• Resultado:
Slide 1: Ponteiros
Slide 2: Vetores
Slide 3: Vetores
Slide 4: Vetores
Slide 5: Vetores
Slide 6: Vetores
Slide 7: Vetores
Slide 8: Vetores
Slide 9: Vetores
Slide 10: Vetores
Slide 11: Vetores
Slide 12: Vetores
Slide 13: Vetores
Slide 14: Vetores
Slide 15: Vetores
Slide 16: Vetores
Slide 17: Vetores
Slide 18: Matriz
Slide 19: Matriz
Slide 20: Matriz
Slide 21: Matriz
Slide 22: Matriz
Slide 23: Matriz
Slide 24: Matriz
Slide 25: Matriz
Slide 26: Matriz
Slide 27: Matriz
Slide 28: Ponteiros
Slide 29: Ponteiros
Slide 30: Ponteiros
Slide 31: Ponteiros
Slide 32: Ponteiros
Slide 33: Ponteiros
Slide 34: Ponteiros
Slide 35: Ponteiros
Slide 36: Ponteiros
Slide 37: Ponteiros
Slide 38: Ponteiros
Slide 39: Ponteiros
Slide 40: Ponteiros
Slide 41: Ponteiros
Slide 42: Ponteiros
Slide 43: Ponteiros
Slide 44: Malloc
Slide 45: Malloc
Slide 46: Malloc
Slide 47: Malloc
Slide 48: Malloc
Slide 49: Malloc
Slide 50: Ponteiros