Qual a função do caractere & ao utilizar scanf( )?
Passo 1
O que o enunciado pede: explicar qual é a função do caractere
Informações dadas: apenas a pergunta direta — não há valores nem código adicional.
& 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:
%dpedeint *, então passa-se&x(endereço dex).
- Código:
- Exemplo (double):
- Código:
double d; scanf("%lf", &d); - Explicação:
%lfpededouble *, então&d.
- Código:
- Exemplo (char):
- Código:
char c; scanf(" %c", &c); - Observação: o espaço antes de
%cfazscanfpular espaços em branco; ainda assim passa-se&c.
- Código:
Passo 5
Quando NÃO usar
& com scanf():- Para ler string com
%se um buffer declarado comochar str[100];, usa-sescanf("%99s", str);sem&. Motivo: o nome do arraystr“decai” parachar *(o endereço do primeiro elemento), então já é o ponteiro quescanfprecisa. Usar&strtem 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 exemploint *p = malloc(...);), então para armazenar um inteiro nessa área usescanf("%d", p);— não use&p, porquepjá éint *.
Passo 6
Erros comuns ao esquecer ou usar errado o
&:- Esquecer o
¶ tipos escalares (ex.:int x; scanf("%d", x);) faz com quescanf()interprete o valor dex(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 depoissscanf()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 *.