C-结构体

2019-08-04  本文已影响0人  小石头呢

结构体:用户自定义可用的数据类型,允许存储不同类型的数据项

一.定义结构

在一般情况下,tag、member-list、variable-list 这 3 部分至少要出现 2 个。

struct tag { 
    member-list
    member-list 
    member-list  
    ...
} variable-list ;

定义一个结构体变量和枚举一样有三种方式:

struct Books{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};

struct Books book;
struct Books{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book;
struct {
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book;

二.结构体变量的初始化

和其它类型变量一样,对结构体变量可以在定义时指定初始值。

#include <stdio.h>
 
struct Books{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book1 = {"C 语言", "RUNOOB", "编程语言", 123456};

struct Books book2;
book2  =  {"C 语言", "RUNOOB", "编程语言", 123456};

int main(){
    printf("title : %s\nauthor: %s\nsubject: %s\nbook_id: %d\n", book1.title, book1.author, book1.subject, book1.book_id);
}

//运行结果
title : C 语言
author: RUNOOB
subject: 编程语言
book_id: 123456

三.访问结构成员

为了访问结构的成员,我们使用成员访问运算符.

#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;        /* 声明 Book1,类型为 Books */
   struct Books Book2;        /* 声明 Book2,类型为 Books */
 
   /* Book1 详述 */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali"); 
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;
 
   /* Book2 详述 */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;
 
   /* 输出 Book1 信息 */
   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);
 
   /* 输出 Book2 信息 */
   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;
}

//运行结果
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

四.结构体作为函数参数

可以把结构作为函数参数,传参方式与其他类型的变量或指针类似

#include <stdio.h>
#include <string.h>
 
struct Books{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
/* 函数声明 */
void printBook( struct Books book );
int main( ){
   struct Books Book1;        /* 声明 Book1,类型为 Books */
   struct Books Book2;        /* 声明 Book2,类型为 Books */
 
   /* Book1 详述 */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali"); 
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;
 
   /* Book2 详述 */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;
 
   /* 输出 Book1 信息 */
   printBook( Book1 );
 
   /* 输出 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);
}

//运行结果
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

五.指向结构体类型的指针

struct Books *struct_pointer;

定义指向结构体的指针,方式与定义指向其他类型变量的指针相似

struct_pointer = &Book1;

可以在上述定义的指针变量中存储结构体变量的地址

struct_pointer->title;

为了使用指向该结构的指针访问结构的成员,必须使用 -> 运算符

#include <stdio.h>
#include <string.h>
 
struct Books{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
/* 函数声明 */
void printBook( struct Books *book );
int main( ){
   struct Books Book1;        /* 声明 Book1,类型为 Books */
   struct Books Book2;        /* 声明 Book2,类型为 Books */
 
   /* Book1 详述 */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali"); 
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;
 
   /* Book2 详述 */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;
 
   /* 通过传 Book1 的地址来输出 Book1 信息 */
   printBook( &Book1 );
 
   /* 通过传 Book2 的地址来输出 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);
}

//运行结果
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

六.结构体的存储大小

结构体内存大小对齐原则:

#include "Test.h"

int main(){

    struct Person{

        char *name;
        
        double score;

        int age;
    };

    printf("%d\n",sizeof(struct Person));

    struct Student{
        char name[10];
        int age;
        double score;
    };

    printf("%d\n",sizeof(struct Student));

    return 0;
}

运行结果:
24
24
Person结构体大小分析
Student结构体大小分析
上一篇 下一篇

猜你喜欢

热点阅读