C - Estruturas
Arrays permitem definir tipos de variáveis que podem conter vários itens de dados do mesmo tipo. Da mesma forma estrutura é outro tipo de dado definido pelo usuário disponível em C que permite combinar itens de dados de diferentes tipos.
As estruturas são usadas para representar um registro. Suponha que você queira acompanhar seus livros em uma biblioteca. Você pode querer rastrear os seguintes atributos sobre cada livro -
- Título
- Autor
- Assunto
- ID do livro
Definindo uma estrutura
Para definir uma estrutura, você deve usar o struct declaração. A instrução struct define um novo tipo de dados, com mais de um membro. O formato da instrução struct é o seguinte -
struct [structure tag] { member definition; member definition; ... member definition; } [one or more structure variables];
A tag de estrutura é opcional e cada definição de membro é uma definição de variável normal, como int i; ou flutuar f; ou qualquer outra definição de variável válida. No final da definição da estrutura, antes do ponto e vírgula final, você pode especificar uma ou mais variáveis de estrutura, mas é opcional. Aqui está a maneira como você declararia a estrutura do livro -
struct Books { char title[50]; char author[50]; char subject[100]; int book_id; } book;
Membros da estrutura de acesso
Para acessar qualquer membro de uma estrutura, usamos o operador de acesso de membro (.) . O operador de acesso ao membro é codificado como um período entre o nome da variável da estrutura e o membro da estrutura que desejamos acessar. Você usaria a palavra-chave struct para definir variáveis do tipo estrutura. O exemplo a seguir mostra como usar uma estrutura em um programa -
Demonstração ao vivo
#include <stdio.h> #include <string.h> struct Books { char title[50]; char author[50]; char subject[100]; int book_id; }; int main( ) { struct Books Book1; /* Declare Book1 of type Book */ struct Books Book2; /* Declare Book2 of type Book */ /* book 1 specification */ strcpy( Book1.title, "C Programming"); strcpy( Book1.author, "Nuha Ali"); strcpy( Book1.subject, "C Programming Tutorial"); Book1.book_id = 6495407; /* book 2 specification */ strcpy( Book2.title, "Telecom Billing"); strcpy( Book2.author, "Zara Ali"); strcpy( Book2.subject, "Telecom Billing Tutorial"); Book2.book_id = 6495700; /* print Book1 info */ printf( "Book 1 title : %s\n", Book1.title); printf( "Book 1 author : %s\n", Book1.author); printf( "Book 1 subject : %s\n", Book1.subject); printf( "Book 1 book_id : %d\n", Book1.book_id); /* print Book2 info */ printf( "Book 2 title : %s\n", Book2.title); printf( "Book 2 author : %s\n", Book2.author); printf( "Book 2 subject : %s\n", Book2.subject); printf( "Book 2 book_id : %d\n", Book2.book_id); return 0; }
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Book 1 title : C Programming Book 1 author : Nuha Ali Book 1 subject : C Programming Tutorial Book 1 book_id : 6495407 Book 2 title : Telecom Billing Book 2 author : Zara Ali Book 2 subject : Telecom Billing Tutorial Book 2 book_id : 6495700
Estruturas como argumentos de função
Você pode passar uma estrutura como um argumento de função da mesma forma que passa qualquer outra variável ou ponteiro.
Demonstração ao vivo
#include <stdio.h> #include <string.h> struct Books { char title[50]; char author[50]; char subject[100]; int book_id; }; /* function declaration */ void printBook( struct Books book ); int main( ) { struct Books Book1; /* Declare Book1 of type Book */ struct Books Book2; /* Declare Book2 of type Book */ /* book 1 specification */ strcpy( Book1.title, "C Programming"); strcpy( Book1.author, "Nuha Ali"); strcpy( Book1.subject, "C Programming Tutorial"); Book1.book_id = 6495407; /* book 2 specification */ strcpy( Book2.title, "Telecom Billing"); strcpy( Book2.author, "Zara Ali"); strcpy( Book2.subject, "Telecom Billing Tutorial"); Book2.book_id = 6495700; /* print Book1 info */ printBook( Book1 ); /* Print Book2 info */ printBook( Book2 ); return 0; } void printBook( struct Books book ) { printf( "Book title : %s\n", book.title); printf( "Book author : %s\n", book.author); printf( "Book subject : %s\n", book.subject); printf( "Book book_id : %d\n", book.book_id); }
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Book title : C Programming Book author : Nuha Ali Book subject : C Programming Tutorial Book book_id : 6495407 Book title : Telecom Billing Book author : Zara Ali Book subject : Telecom Billing Tutorial Book book_id : 6495700
Ponteiros para estruturas
Você pode definir ponteiros para estruturas da mesma maneira que define ponteiro para qualquer outra variável -
struct Books *struct_pointer;
Agora, você pode armazenar o endereço de uma variável de estrutura na variável de ponteiro definida acima. Para encontrar o endereço de uma variável de estrutura, coloque o '&'; operador antes do nome da estrutura como segue −
struct_pointer = &Book1;
Para acessar os membros de uma estrutura usando um ponteiro para essa estrutura, você deve usar o operador → da seguinte forma −
struct_pointer->title;
Vamos reescrever o exemplo acima usando o ponteiro de estrutura.
Demonstração ao vivo
#include <stdio.h> #include <string.h> struct Books { char title[50]; char author[50]; char subject[100]; int book_id; }; /* function declaration */ void printBook( struct Books *book ); int main( ) { struct Books Book1; /* Declare Book1 of type Book */ struct Books Book2; /* Declare Book2 of type Book */ /* book 1 specification */ strcpy( Book1.title, "C Programming"); strcpy( Book1.author, "Nuha Ali"); strcpy( Book1.subject, "C Programming Tutorial"); Book1.book_id = 6495407; /* book 2 specification */ strcpy( Book2.title, "Telecom Billing"); strcpy( Book2.author, "Zara Ali"); strcpy( Book2.subject, "Telecom Billing Tutorial"); Book2.book_id = 6495700; /* print Book1 info by passing address of Book1 */ printBook( &Book1 ); /* print Book2 info by passing address of Book2 */ printBook( &Book2 ); return 0; } void printBook( struct Books *book ) { printf( "Book title : %s\n", book->title); printf( "Book author : %s\n", book->author); printf( "Book subject : %s\n", book->subject); printf( "Book book_id : %d\n", book->book_id); }
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Book title : C Programming Book author : Nuha Ali Book subject : C Programming Tutorial Book book_id : 6495407 Book title : Telecom Billing Book author : Zara Ali Book subject : Telecom Billing Tutorial Book book_id : 6495700
Campos de bits
Campos de bits permitem o empacotamento de dados em uma estrutura. Isso é especialmente útil quando a memória ou o armazenamento de dados são escassos. Exemplos típicos incluem -
-
Empacotando vários objetos em uma palavra de máquina. por exemplo. Os sinalizadores de 1 bit podem ser compactados.
-
Lendo formatos de arquivo externos -- formatos de arquivo não padrão podem ser lidos, por exemplo, inteiros de 9 bits.
C nos permite fazer isso em uma definição de estrutura colocando :bit length após a variável. Por exemplo -
struct packed_struct { unsigned int f1:1; unsigned int f2:1; unsigned int f3:1; unsigned int f4:1; unsigned int type:4; unsigned int my_int:9; } pack;
Aqui, o pack_struct contém 6 membros:Quatro sinalizadores de 1 bit f1..f3, um tipo de 4 bits e um my_int de 9 bits.
C empacota automaticamente os campos de bits acima da forma mais compacta possível, desde que o comprimento máximo do campo seja menor ou igual ao comprimento da palavra inteira do computador. Se este não for o caso, alguns compiladores podem permitir sobreposição de memória para os campos, enquanto outros armazenariam o próximo campo na próxima palavra.
Linguagem C
- Estruturas e classes em C ++
- Semáforos:serviços utilitários e estruturas de dados
- Crítica do livro:digitalize ou morra
- Um futuro muito humano
- Tecnologia de armazenamento de dados magnéticos de última geração
- 17 Melhores livros de programação para ler em 2021
- Java - Estruturas de Dados
- C - typedef
- Estruturas de dados C++
- C# - Estruturas