A passagem de parâmetro já está sendo feita, não precisa do asterístico! printf("%s",*(p+i)->nome); fica printf("%s",(p+i)->nome); Veja que (p+1) é a 1ª struct. Pela teoria da struct devemos colocar um ponto para acessar o conteúdo da struct, não concorda?! Se assemelha ao que você quer fazer de ponteiro para struct, para você acessar o conteúdo struct com um ponteiro, devíamos colocar um asterico na frente para indicar o valor e o ponto para indicar acesso a struct...mas a "banda não toca assim"! Logo o asterísco e o ponto são interpretados como seta! Ou seja para PEGAR O VALOR ACESSANDO A STRUCT devemos usar a seta ao invés de um asterístico e um ponto. *p.nome não funciona, mas (*p).nome funciona, e: (*p).nome é a mesa coisa de p->nome ai sim você estaria acessando a string (ou valor) da struct...ou seja, (*(p+1)).nome = (p+1)->nome.