Obrigado. Era esse “truque” que estava esperando como resposta.
Então, se o parametro de uma função exigir uma variável com ponteiro.
Posso passar (sem o compilador reclamar):
Aluno *aluno;
funcao(aluno);
ou
Aluno aluno;
funcao(&aluno);
Eu havia aprendido/entendido que só poderia passar referencia de ponteiro se fosse criada uma variavel com o ponteiro (*). Mas isso faz sentido. Agora entendi porque no scanf,fread, fwrite,… é exigido o & junto com a variavel.
Só pra finalizar nas dúvidas sobre ponteiros:
Então quando eu crio a variavel: Aluno aluno; fica alocado um espaço na memória para a variavel, como voce falou: o objeto foi criado. Se eu passar para a função o parametro &aluno. A função vai alterar os atributos desse aluno direto no endereço da memória. Esse endereço na memória é o ponteiro para o objeto criado.
Agora se eu criar uma variável Aluno *aluno; ela é apenas um ponteiro para algum endereço de memória. Como nenhum endereço foi atribuido ela não está apontando para nada (inclusive da esse erro se tentar olhar o valor do endereço da memória desse ponteiro: Must take address of a memory location).
No entanto, se eu tiver as funções como escrevi no inicio desse post ambas funcionam.
Por isso, fiz o seguinte teste:
Aluno *aluno;
fread( aluno, sizeof(Aluno), 1, arquivo );
E funcionou a leitura. (então tenho como usar daquela maneira com ponteiro a função fread, mas a maneira como você citou parece mais elegante).
Então ambas as soluções produzem o mesmo resultado?
Quanto ao lixo da variável criada com o ponteiro. Criei duas estruturas(com uma variavel do tipo inteiro dentro) uma com o ponteiro outra sem.
Na variavel sem ponteiro valor = -29147
Na variavel com ponteiro valor = 767
Não seriam ambos os valores lixo? (considerando que no Java o valor inteiro tem por padrão 0. O valor inteiro padrão no C é -29147? )