#include <stdio.h>
#include <stdlib.h>
int main(){
char name[100];
int age;
printf("Enter you name:\n");
scanf("%s", name);
printf("Enter you age:\n");
scanf("%d", &age);
printf("You are %s,\nYour age is %d", name, age);
return 0;
}
Peço desculpas antecipadamente se isso já foi respondido antes. Sou iniciante em programação e esta é minha primeira postagem. Estou aprendendo C, mas não entendo isto: Por que precisamos do '&' para a variável int age, mas não para a variável array name?
Devido ao histórico de C, um array é automaticamente convertido em um ponteiro para seu primeiro elemento, exceto quando é o operando de
sizeof
ou um operador typeof ou unário&
ou é um literal de string usado para inicializar um array.Então
scanf("%s", name);
é equivalente ascanf("%s", &name[0]);
. Ele passa um endereço parascanf
.Nos primeiros dias da linguagem C, não havia provisões para lidar com objetos agregados, como arrays ou estruturas — nenhuma operação agiria em todo o objeto agregado como se fosse um único objeto. As operações eram realizadas apenas em itens individuais simples, como
char
,int
,float
e ponteiros. Os computadores eram muito mais lentos e menos capazes do que os computadores de hoje, e as linguagens de programação geralmente faziam coisas muito simples.No entanto, os programadores precisavam trabalhar com arrays de alguma forma. Como a linguagem não suportava usar o nome de um array para se referir ao array inteiro como se fosse um único valor de um objeto agregado, essa noção de uma conversão automática de um array para um ponteiro foi projetada para facilitar o trabalho com arrays. Escrever
scanf("%s", name);
em vez descanf("%s", &name[0]);
parece mais bonito e é mais fácil de digitar. Então essa conveniência foi feita parte da linguagem.Você não podia nem atribuir estruturas em C, como dizer
a = b
para um tipo de estrutura. Isso foi adicionado mais tarde. Uma vez que as linguagens de programação e compiladores se tornaram poderosos o suficiente para tornar construções mais fortes práticas, era tarde demais para mudar como os arrays se comportavam em C. Para fazera = b
funcionar para um array, teríamos que remover a conversão automática de um array para um ponteiro. Então agora esse é um recurso permanente de C.O nome da variável representa seu valor, e você precisa de '&' para obter explicitamente seu endereço. Por outro lado, o nome do array já atua como um ponteiro para o primeiro elemento do array, como se o nome sozinho representasse o endereço de memória onde o primeiro elemento name[0] é armazenado.
Então o operador '&' é necessário para que a variável int obtenha seu endereço.
Quando o gcc compila esse código, name é um valor apontado para o array, tudo bem. Mas se você usar apenas age, ele será substituído pelo valor real de age, não pelo endereço, então você precisa obter o endereço de age. Usar &age está bom.