Академический Документы
Профессиональный Документы
Культура Документы
Endereços e Ponteiros
Universidade Estadual do Maranhão
Curso de Engenharia da Computação
Mestrado em Engenharia da Computação e Sistemas
Endereços
Em C, o endereço de um objeto é dado pelo operador &. Não confunda este & com o
operador lógico and, representado por &&. Assim, se i é uma variável então &i é o seu
endereço.
O operador & aparece frequentemente nas invocações da função scanf, por exemplo.
Se i é uma variável inteira, podemos escrever scanf(“%d”, &i).
Ponteiros
int *p;
Exercícios
1. Se i é uma variável do tipo int, que sentido fazem as expressões *&i e &&i ?
2. Leia o verbete Poiter na Wikipedia.
3.
Uma Aplicação
Suponha que precisamos de uma funções que troque os valores de duas variáveis
inteiras i e j. A função
int temp;
temp = i; i = j; j = temp;
Não produz o efeito desejado, pois recebe apenas os valores das variáveis e não as
variáveis propriamente ditas. Para obter o efeito desejado, é preciso passar à função os
endereços das variáveis:
int temp;
troca(&i , &j);
Exercícios
1. Um ponteiro pode ser usado para dizer a uma função onde ela deve depositar o
resultado de seus cálculos. Escreva uma função hm que converta minutos em horas-e-
minutos. A função recebe um inteiro t e os endereços de duas variáveis inteiras,
Universidade Estadual do Maranhão
Curso de Engenharia da Computação
Mestrado em Engenharia da Computação e Sistemas
Vetores
O tipo vetor permite armazenar mais de um valor em uma mesma variável. O tamanho
dessa variável é definido na sua declaração, e seu conteúdo é dividido em posições. Nessa
estrutura todos os elementos são do mesmo tipo, e cada um pode receber um valor diferente.
Exemplo:
int v[5]
Vetores e Endereços
Universidade Estadual do Maranhão
Curso de Engenharia da Computação
Mestrado em Engenharia da Computação e Sistemas
int *v;
v[i] = 987;
Têm o mesmo efeito. Todas estas considerações também valem se o vetor tiver sido
alocado estaticamente, por uma declaração como:
int v[100];
Mas nesse caso v é uma espécie de “ponteiro constante”, cujo valor não pode ser
alterado.
Qualquer dos dois fragmentos de código abaixo pode ser usado para “carregar” o
vertor v[0..99].
Exercícios
1. Seja v um vetor de int’s. suponha que cada int ocupa 8 bytes no seu computador. Se o
endereço de v[0] é 55000, qual o valor da expressão v + 3?
2. Se v é um vetor, qual a diferença conceitual entre as expressões v[3] e v + 3?
3. Suponha que o vetor v e a variável k foram declarados assim:
int v[100], k;
Universidade Estadual do Maranhão
Curso de Engenharia da Computação
Mestrado em Engenharia da Computação e Sistemas
Matrizes
Definição:
int matriz[2][2];
Estrutura homogênea;
Arranjo bi ou multidimensional (um índice por dimensão);
Alocação estática;
Posições contíguas de memória;
Exemplo:
Matrizes Especiais
Matrizes Diagonais
Ex.: Matriz 4 x 4:
Matrizes Triangulares
Ex.:
M[i,j] = v[j + i * (i − 1) / 2]
Uma matriz é simétrica quando M[i,j] = M[j,i] e é anti-simétrica quando M[i,j] = -M[j,i].
Neste caso, é necessário representar apenas os elementos do triângulo superior ou inferior
pelo mesmo método usado para matrizes triangulares.
Ex.:
Exercícios
1. Escreva uma função que receba uma matriz como entrada e retorne em um vetor a
sua diagonal principal;
2. Escreva uma função que receba uma matriz como entrada e retorne em um vetor a
sua diagonal secundaria;
3. Escreva uma função que receba uma matriz como entrada e retorne em um vetor os
elementos da matriz triangular que estão abaixo da diagonal principal;
4. Escreva uma função que receba uma matriz como entrada e retorne em um vetor os
elementos da matriz triangular que estão acima da diagonal principal;
5. Escreva uma função que receba uma matriz como entrada e retorne em um vetor os
elementos da matriz triangular que estão abaixo da diagonal secundaria;
6. Escreva uma função que receba uma matriz como entrada e retorne em um vetor os
elementos da matriz triangular que estão acima da diagonal secundaria;
7. Escreva uma função que verifique se uma matriz é simétrica;
8. Escreva uma função que verifique se uma matriz é anti-simétrica;
Matrizes Esparsas
Em uma matriz esparsa, a maioria dos elementos é igual a zero, sendo apenas 30% dos
valores significativos. Para esse tipo de estrutura também armazenam-se apenas os valores
significativos. Veja a figura abaixo:
Uma matriz é dita esparsa quando possui uma grande quantidade de elementos que
valem zero (ou não presentes, ou não necessários). Matrizes esparsas têm aplicações em
Universidade Estadual do Maranhão
Curso de Engenharia da Computação
Mestrado em Engenharia da Computação e Sistemas
problemas de engenharia, física (por exemplo, o método das malhas para resolução de
circuitos elétricos ou sistemas de equações lineares). Também têm aplicação em computação:
armazenamento de dados (e.g., planilhas eletrônicas)
struct Celula {
double valor;
Uma implementação mais simples seria por meio de um arranjo com a seguinte
estrutura:
struct Celula {
double valor;
Exercícios