Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.

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

Mais conteúdos dessa disciplina