Programação II
Vetores de Ponteiro de
Estrutura
Bruno Feijó
Dept. de Informática, PUC-Rio
Arrays (vetores) de Ponteiros para Estruturas
mat
nome
AnoRef
...
#define N 3
ano
semestre
Aluno v[N];
Gastaria os bytes relativos a mat,
nome e AnoRef
Ponteiros são mais eficientes !
Aluno ** v;
Requereria alocação dinâmica
Como ficaria a liberação de memória ?
... faça depois esta opção
int main(void)
{
Aluno * v[N];
...
for (i=0;i<N;i++)
lê matrícula, ano, semestre, nome
chama função criaAluno que retorna valor para v
imprime v
libera memória (e exibe mensagem)
return 0;
}
Exemplo de Vetor de Ponteiros para Estruturas - Alunos
Se for char * nome;
requer malloc e strcpy,
pois
malloc(sizeof(Aluno))
só criaria espaço para
ponteiro
... includes
struct anoRef
{
int ano;
int semestre;
};
typedef struct anoRef AnoRef;
struct aluno
{
int mat;
char nome[81];
AnoRef anoIn;
};
typedef struct aluno Aluno;
#define N 3
... Protótipos
int main(void)
{
Aluno * v[N];
int i, mat, ano, sem;
char s[81];
for (i=0;i<N;i++)
{
scanf ("%d %d %d %80[^\n]",&mat,&ano,&sem,s);
v[i] = criaAluno(mat,s,ano,sem);
}
printf("Matricula, Nome, Ano e Semestre:\n");
imprimeTudo(N,v);
liberaAlunos(N,v);
return 0;
}
void imprimeTudo(int n, Aluno ** v)
{
int i;
for (i=0; i<n; i++)
printf("%d %s %d %d\n",v[i]->mat,v[i]->nome,v[i]->anoIn.ano,v[i]->anoIn.semestre);
}
void liberaAlunos(int n, Aluno ** v)
{
int i;
for (i=0; i<n; i++)
free(v[i]);
printf("Todos os alunos liberados\n");
}
Exemplo de Vetor de Ponteiros para Estruturas - Alunos
Aluno * criaAluno(int mat, char * s, int ano, int sem)
{
Aluno * p;
p = (Aluno *)malloc(sizeof(Aluno));
if (p == NULL)
return NULL;
p->mat = mat;
strcpy(p->nome,s);
p->anoIn.ano = ano;
p->anoIn.semestre = sem;
return p;
}
Download

(vetores) de Ponteiros para Estruturas - PUC-Rio