Qual a função do caractere & ao utilizar scanf( )?

Passo 1

O que o enunciado pede: explicar qual é a função do caractere & ao usar scanf() em C.
Informações dadas: apenas a pergunta direta — não há valores nem código adicional.

Passo 2

Para entender o & precisamos ver o que scanf() faz: scanf() lê dados do teclado (stdin) e coloca esses dados nas variáveis que você indicar. Como funções em C recebem argumentos por valor, scanf() não pode alterar diretamente a variável do chamador se receber apenas o valor dela — precisa do endereço (onde a variável está na memória) para escrever o valor lido. Portanto, os argumentos que scanf() espera (de acordo com o especificador de formato) são ponteiros para os tipos correspondentes: por exemplo, para "%d" ele espera um int *, para "%lf" espera um double *, para "%c" espera um char *, para "%s" espera um char * (ponteiro para buffer), etc.

Passo 3

O que é & em C: & é o operador “address-of” (operador de endereço). Quando aplicado a uma variável, &var produz o endereço de memória onde var está armazenada. O tipo de &var é “ponteiro para o tipo de var”: se var é int, então &var tem tipo int *.

Passo 4

Como isso se aplica ao scanf(): você passa &variavel para scanf() quando o especificador de formato exige um ponteiro para o tipo da variável. Exemplos práticos:
  • Exemplo (inteiro):
    • Código: int x; scanf("%d", &x);
    • Explicação: %d pede int *, então passa-se &x (endereço de x).
  • Exemplo (double):
    • Código: double d; scanf("%lf", &d);
    • Explicação: %lf pede double *, então &d.
  • Exemplo (char):
    • Código: char c; scanf(" %c", &c);
    • Observação: o espaço antes de %c faz scanf pular espaços em branco; ainda assim passa-se &c.

Passo 5

Quando NÃO usar & com scanf():
  • Para ler string com %s e um buffer declarado como char str[100];, usa-se scanf("%99s", str); sem &. Motivo: o nome do array str “decai” para char * (o endereço do primeiro elemento), então já é o ponteiro que scanf precisa. Usar &str tem tipo diferente (char (*)[100]) e causa incompatibilidade de tipos (na prática muitas vezes funciona porque o endereço é o mesmo, mas é incorreto e pode levar a comportamento indefinido).
  • Se você já tem um ponteiro que aponta para uma área válida para armazenar um int (por exemplo int *p = malloc(...);), então para armazenar um inteiro nessa área use scanf("%d", p); — não use &p, porque p já é int *.

Passo 6

Erros comuns ao esquecer ou usar errado o &:
  • Esquecer o & para tipos escalares (ex.: int x; scanf("%d", x);) faz com que scanf() interprete o valor de x (que está sem inicializar) como um endereço de escrita — isso geralmente causa violação de memória (segfault) ou comportamento indefinido.
  • Passar um tipo de ponteiro incompatível com o especificador (ex.: passar double * para %d) também causa comportamento indefinido.
  • Sempre combine o especificador de formato com o tipo de ponteiro correto.

Passo 7

Dicas práticas e segurança:
  • Verifique sempre o retorno de scanf() (número de itens lidos) para tratar erros.
  • Para ler strings com segurança, limite o tamanho: scanf("%99s", str);.
  • Para entrada de linhas completas prefira fgets() e depois sscanf() ou parsing manual para evitar problemas de buffer e espaços em branco.
  • Lembre-se: scanf() precisa do endereço onde escrever — o & fornece esse endereço quando a variável é um objeto simples (não um array que já é um ponteiro).

Resposta

O & é o operador “address-of” em C; em scanf() ele é usado para passar o endereço (ponteiro) da variável onde scanf deve armazenar o valor lido (por exemplo int x; scanf("%d", &x);). Exceção comum: ao ler strings com %s e um array char str[], não se usa & porque str já decai para char *.

Exercícios relacionados