PUC Que Pariu!

INF1005 - Programação 1 - Exercícios de Fixação

Ponteiros em C

Atualizado em 09 de Novembro de 2014
Preparado por Ian Albuquerque

Exercício 01 ( ID: EX-PONTEIROS-001 )

Considere o programa a seguir:

O que este programa imprime na tela?
Tente responder e explicar sua resposta sem executar o programa.
Após tentar, execute-o para conferir sua resposta.

Dica: Desenhe em um papel como as variáveis ficam na memória e quais valores são atribuídos a elas.

Assuntos:

  • Operadores * e &.
  • Ponteiros na memória.

Exercício 02 ( ID: EX-PONTEIROS-002 )

Considere os cinco programas a seguir. Eles são parecidos, porém sutilmente diferentes.

Descreva o que cada programa imprimirá na tela.
Tente responder e explicar sua resposta sem executar o programa.
Certifique-se de entender o motivo de cada um dos valores impressos na tela.

Dica: Desenhe em um papel como as variáveis ficam na memória e preste muita atenção em que variável cada soma ocorre. Em seu desenho, inclua valores arbitrários para os endereços das variáveis.

Exercício 03 ( ID: EX-PONTEIROS-003 )

Tarefa A

Considere o programa a seguir:

O que este programa imprime na tela? Tente responder e explicar sua resposta sem executar o programa.

Dica: Desenhe em um papel todas as variáveis, passo a passo, explicitando em que local da memória as variáveis estarão. Duas variáveis com o mesmo nome não necessariamente são a mesma variável.

Tarefa B

Uma vez feita a tarefa A, considere o programa a seguir:

Este programa é sutilmente diferente do programa anterior.
O que este programa imprime na tela? Tente responder sem executar o programa.
Você consegue explicar detalhadamente a diferença do mecanismo de funcionamento dos dois programas?

Assuntos:

  • Passagem por referência.
  • Variáveis locais.

Exercício 04 ( ID: EX-PONTEIROS-004 )

Considere o operador sizeof de C.
Esse operador de C retorna o número de bytes necessários na memória para armazenar um determinado tipo de dado na máquina em que o programa está sendo executado.

Exemplos:

  • sizeof(char) retorna 1 byte.
  • sizeof(short) retorna 2 bytes.
  • sizeof(int) retorna 2 ou 4 bytes, dependendo da máquina
  • sizeof(float) retorna 4 bytes
  • sizeof(double) retorna 8 bytes

Observe o programa a seguir:

Você consegue prever o que será impresso na tela?

Agora, compile e execute o programa. Você consegue explicar o que foi impresso na tela?

Assuntos:

  • Variáveis na memória.
  • Ponteiros na memória.

Exercício 05 ( ID: EX-PONTEIROS-005 )

Tarefa A

Escreva uma função que troca o valor de duas variáveis do tipo inteiro.
A função deve possuir o seguinte protótipo:

void swap(int* x, int* y);

Teste sua função com a seguinte função main:

A sua função deverá imprimir na tela o seguinte ao ser testada com a main dada:

Tarefa B

Utilizando a função swap desenvolvida na tarefa anterior, escreva uma função que troque o valor de duas variáveis do tipo inteiro SOMENTE se o valor da primeira variável for MENOR que o valor da segunda variável. Ou seja, o maior valor passará a ser a primeira variável.
A função deve possuir o seguinte protótipo:

void swapIfLess(int* x, int* y);

Teste sua função com a seguinte função main:

A sua função deverá imprimir na tela o seguinte ao ser testada com a main dada:

Tarefa C

Marcos deve organizar três pilhas de caixas em ordem decrescente de altura. Faça um programa receba como entrada três valores correspondendo à altura das pilhas que Marcos deve organizar e que imprima na tela as alturas em ordem decrescente.

Importante: Este programa deve necessariamente utilizar somente três variáveis do tipo inteiro (uma para cada altura de pilha) e utilizar a função swapIfLess desenvolvida na tarefa anterior.

Exemplos de Entradas e Saídas.
Entrada Saída Esperada
54 99 23 99 54 23
100 50 3 100 50 3
9 20 55 55 20 9
60 7 70 70 60 7