Buscar

Exercício - Ponteiros e Alocação Dinâmica de Memória

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 5 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Universidade Estadual da Paraíba - UEPB 
Centro de Ciências e Tecnologia - CCT 
Departamento de Computação - DC 
 
Disciplina: Linguagem de Programação I 
Docente: Ícaro Lins Leitão da Cunha 
Período: 2014.1 
 
Ponteiros e Alocação Dinâmica de Memória 
 
1. Elabore um programa que declare 4 variáveis do tipo inteiro e 4 do tipo ponteiro de inteiro, 
e faça com que as variáveis ponteiro apontem para uma das variáveis inteiro. Utilize o 
operador que permita modificar os valores das variáveis inteiras através das variáveis 
ponteiro e escreva uma função de troca para trocar os valores apontados pelos 4 ponteiros. 
Faça a simulação passo-a-passo para visualizar o que está acontecendo em cada linha do 
programa. 
 
2. Faça um programa onde um vetor de ponteiros tenha cada uma das suas posições apontando 
para as equivalentes de um vetor de valores float. A posição 0 do vetor ponteiro deve 
apontar para a posicao 0 do vetor float e assim por diante. 
 
3. No exercício anterior, caminhe no vetor float e mostre para cada posição vetor float, seu 
endereco e seu conteudo. 
 
4. Faça um programa em C que preencha um vetor com letras minúsculas e, através de um 
vetor de ponteiros (como no ex. 3), altere as letras para maiúsculas. (Para alterar as letras do 
vetor de caracteres, você deve utilizar o vetor de ponteiros!) 
 
5. Faça uma rotina que aloque memória dinamicamente e atribua o endereço alocado à uma 
variável pt. Em seguida mostre no monitor o endereço alocado (use %p, de pointer). 
Coloque a linha de alocação e impressão dentro de um for e observe: 
o endereços alocados; 
o o estouro de memória disponível quando pt=0 (demora um pouco...). 
 
6. Simule o exercício anterior, no papel, durante 5 passagens pelo for e verifique: 
o as mudanças na variável pt; 
o o que acontecerá com a memória alocada na passagem anterior pelo for. 
 
7. Por que o código abaixo está errado? 
void troca( int *i, int *j) { 
 int *temp; 
 *temp = *i; *i = *j; *j = *temp; 
} 
 
8. Explique o que a sequência de operações a baixo fazem para o ponteiro p (definido int *p). 
Demonste o passo a passo (desenhando) seguindo a representação de memória (abaixo). 
 
7 
8 
1 
6 
3 
 
(*p)++; 
p++; 
*(p++); 
(*(--p))++; 
(p++)++; 
 
 
9. Implemente a função strcpy (char *destino, char *origem) usando ponteiros. 
 
10. Implemente a função strcmp (char *str1, char *str2) usando ponteiros. 
 
11. Mostre na tabela abaixo todos os passos (teste de mesa) e identifique qual será a saída do 
programa em C, para os valores lidos (x = 3 e y = 4). Caso ache necessário, faça também 
uma simulação desenhando o que ocorre em memória. 
 
void func(int *px, int *py) 
{ 
px = py; 
*py = (*py) * (*px); 
*px = *px + 2; 
} 
void main(void) 
{ 
int x, y; 
scanf(“%d”,&x); 
scanf(“%d”,&y); 
func(&x,&y); 
printf(“x = %d, y = %d”, x, y); 
} 
Teste de Mesa 
x y px py 
 
 
 
 
 
 
 
 
 
 
P -> 
 
12. Escreva os valores das variáveis para cada instrução do programa abaixo. Qual a saída do 
programa? 
Int main(int argc, char *argv[]) 
{ 
int a,b,*p1, *p2; 
a = 4; 
b = 3; 
p1 = &a; 
p2 = p1; 
*p2 = *p1 + 3; 
b = b * (*p1); 
(*p2)++; 
p1 = &b; 
printf("%d %d\n", *p1, *p2); 
printf("%d %d\n", a, b); 
} 
 
Teste de Mesa 
a b p1 p2 
 
 
 
 
 
 
 
 
 
 
13. Escreva uma função mm que receba um vetor inteiro v[0..n-1] e os endereços de duas 
variáveis inteiras, digamos min e max, e deposite nessas variáveis o valor de um elemento 
mínimo e o valor de um elemento máximo do vetor. Escreva também uma função main que 
use a funçãomm. 
 
14. Faça uma função MAX que recebe como entrada um inteiro n, uma matriz inteira Anxn e 
devolve três inteiros: k, l e c. k é o maior elemento de A e é igual a A[l][c]. Se o elemento 
máximo ocorrer mais de uma vez, indique em l e c qualquer uma das possíveis posições. 
Use ponteiros para os argumentos 
 
15. Suponha que os elementos do vetor v são do tipo int e cada int ocupa 8 bytes no seu 
computador. Se o endereço de v[0] é 55000, qual o valor da expressão v + 3? 
 
16. Escreva um programa que leia um número inteiro positivo n seguido de n números inteiros e 
imprima esses n números em ordem invertida. O seu programa não deve impor limitações 
sobre o valor de n. 
 
 
 
17. Suponha que v é um vetor declarado assim: 
 int v[100]; 
Descreva, em português, a sequência de operações que deve ser executada para calcular o 
valor da expressão 
 &v[k + 9]; 
 
18. Suponha que v é um vetor. Descreva a diferença conceitual entre as expressões v[3] e v + 3. 
 
19. O que há de errado com o seguinte trecho de código? 
char *a, *b; 
a = "abacate"; 
b = "uva"; 
if (a < b) 
 printf( "%s vem antes de %s no dicionário", a, b); 
else 
 printf( "%s vem depois de %s no dicionário", a, b); 
 
20. Diga (sem usar o computador) qual o conteúdo do vetor a depois dos seguintes comandos. 
int a[99]; 
for (i = 0; i < 99; ++i) 
 a[i] = 98 - i; 
for (i = 0; i < 99; ++i) 
 a[i] = a[a[i]]; 
 
21. Veja como você está. Faca um programa que multiplique duas matrizes. O programa deverá 
estar estruturado de maneira que: 
I. O usuário forne as dimensões das matrizes (teste se as dimensões são compatíveis, 
isto é, se as matrizes podem ser multiplicadas); 
II. As matrizes devem ser alocadas dinamicamente; 
III. As matrizes devem ter seus valores lidos pelo teclado (faça uma função para leitura 
das matrizes); as matrizes devem, então, ser multiplicadas (faça uma função para a 
multiplicação); 
IV. A matriz resultante deve ser apresentada em tela (faça uma função para apresentar a 
matriz na tela). 
OBS: 
a) Faça, também, alocação dinâmica da matriz resultante. 
b) Veja o código exemplo de ponteiro para ponteiro e matrizes. Caso seja necessário. 
c) Para um desafio maior, faça o programa ser multi-arquivos, ou seja, coloque as 
funções de matriz (alocação, leitura, cálculo e impressão) em um arquivo separado 
do arquivo do main e chame esse arquivo usando o #include.

Continue navegando