#+title: Curso Básico da Linguagem C
#+subtitle: Exercícios
#+author: Blau Araujo
#+startup: show2levels
#+options: toc:3

* Exercícios da aula 4: Variáveis e ponteiros

- [[../../aulas/04-variaveis/README.org][Anotações da aula]]
- [[https://youtu.be/i7RKtMgSSrM][Vídeo]]


** 1. Pesquise e responda

- Existe uma forma para alterar uma variável em uma função a partir de
  outra função: como fazer isso?
- Por que as variáveis de uma função, em princípio, são locais à própria
  função?
- Se o valor associado a um ponteiro é um endereço, o que termos com a
  avaliação de =&NOME_DO_PONTEIRO=?

** 2. Analise o código, pesquise e responda

Este é mais um "Olá, mundo":

#+begin_src c
#include <stdio.h>

char *msg = "Salve, simpatia!";

int main(void) {
    puts(msg);
    return 0;
}
#+end_src

Se ponteiros recebem endereços como valores, por que eu fiz a atribuição
de uma string e o meu programa funcionou?

** 3. Compile, analise e demonstre

#+begin_src c
#include <stdio.h>

int main(void) {

    int a = 0;
    int b = 875569217;
    int c = 1280655661;
    int d = 1129071171;

    char *p = (char *)&d;
    
    int i = 0;
    while (*(p + i) != '\0') {
        putchar(*(p + i));
        i++;
    }
    putchar('\n');

    // printf("%p\n%p\n%p\n%p\n", &d, &c, &b, &a);
    
    return 0;
}
#+end_src

- Como o código funciona?
- O que estou tentando imprimir?
- Com o =printf= comentado, eu consigo imprimir o que eu quero?
- Se eu tirar o comentário, eu tenho a impressão que eu quero?
- Por que acontece essa diferença de comportamento?
- Como imprimir corretamente apenas o que eu quero?

** 4. Pesquise e responda

- Para que serve e como usar a função =putchar=?
- Quando e por que utilizar =putchar('\n')= em vez de =puts("")=?
- Como funciona a estrutura de repetição =while=?
- Para que servem os especificadores de formato =%zu= e =%p=? 

** 5. Desafio: quadrado de um número

Crie um programa que peça a digitação de um número inteiro ao usuário
e imprima o quadrado desse número.

*Requisitos:*

- O programa deve testar se o número digitado é um inteiro válido.
- Se não for, o programa deve terminar com uma mensagem enviada para
  a saída padrão de erros (=stderr=) e estado de término =1=.

*Dicas:*

- Utilize a função =scanf= para ler o número digitado.
- Existe uma variante do =printf= que possibilita imprimir na saída de erros
  em vez da saída padrão.
- Existe um cabeçalho que define constante com os limites dos tipos inteiros.

