Struct
Slides
Nota sobre atribuição de struct
Quando o C foi criado, as únicas operações suportadas em struct eram o endereçamento (e.g.
&aluno
) e o acesso a um campo (e.g.aluno.nome
oupointer_aluno->nome
). A atribuição de struct não era suportada.Contudo, a atribuição de struct foi adicionada posteriormente.
A atribuição de struct copia o conteúdo de uma struct para outra struct do mesmo tipo.
Exemplo: ```c #include <stdio.h> #include <string.h>
typedef struct { char nome[50]; int num; } Pessoa;
int main(){ // criar 2 pessoas com dados diferentes Pessoa p1 = {“Isaac Asimov”, 42}; Pessoa p2 = {“Albert Einstein”, 87}; printf(“p1rintf(”p2/ copiar pessoa 1 para 2 p2=p1; printf(“p2/ alterar pessoa 1 não altera pessoa 2 strcpy(p1.nome,”Douglas Adams”); printf(“p1rintf(”p2%s - %d“, p2.nome, p2.num); } ```
Neste exemplo alterar o nome da pessoa 1 não altera o nome da pessoa 2, pois a atribuição de struct copia o conteúdo da struct, incluindo a string (array de
char
) do nome.Contudo, a cópia é superfiial. Se existirem apontadores na definição da struct, a atribuição copia apenas o endereço para o qual os apontadores apontam, e não o seu conteúdo.
Exemplo: ```c typedef struct { char * nome; int nota; } Aluno;
struct Aluno aluno1; aluno1.nome = malloc(50 * sizeof(char)); strcpy(aluno1.nome, “João”); aluno1.nota = 10; printf(“Nome aluno 1: %s”, aluno1.nome); // Imprime “João”
struct Aluno aluno2 = aluno1; aluno1.nome[0] = ‘M’; printf(“Nome aluno 1: %s”, aluno1.nome); // Imprime “Moão” ```
Neste exemplo, a alteração do nome do aluno 2 altera o nome do aluno 1, pois o campo
nome
de cada um aponta para a mesma região de memória.
Vídeos
- Intro, motivação | 1.5min
- Declarar, aceder | 4min
- Comparação, estruturas dentro de estruturas, funções | 4min
- typedef | 2min
- estruturas e apontadores | 4min
- Demo 1 | 10min
- Demo 1 | correção de criar_aluno | 3min
- Demo 1a | vector de Aluno | 4min
- Demo 1b
- Demo 1c
- Demo 1d
- Demo 1f
- Demo 1g