construction - yaokun123/php-wiki GitHub Wiki

结构体

一、结构体声明

struct 结构体名称{
    结构体成员1;
    结构体成员2;
    结构体成员3;
 };
 
 eg:
 struct Book{
    char title[128];
    char author[40];
    float price;
    unsigned int date;
    char publisher[40];
 };

二、定义结构体类型变量

struct 结构体名称 结构体变量名

eg:struct Book book;

还可以在声明的时候直接定义

struct Book{
    char title[128];
    char author[40];
    float price;
    unsigned int date;
    char publisher[40];
} book;//注意这里有一个分号

三、访问结构体变量

要访问结构体成员,我们需要引入一个新的运算符号---点号(.)运算符。比如book.title就是引用book结构体的title成员,它是一个字符数组;而 book.price则是引用book结构体的price成员,它是一个浮点型的变量。

struct Book{
    char title[128];
    char author[40];
    float price;
    unsigned int date;
    char publisher[40];
} book;//注意这里有一个分号

int main(){
    //struct Book book;这里是定义结构体类型变量的另一种方式
    printf("请输入书名:");
    scanf("%s",book.title);
    printf("请输入作者:");
    scanf("%s",book.author);
    printf("请输入售价:");
    scanf("%f",&book.price);
    printf("请输入出版日期:");
    scanf("%d",&book.date);
    printf("请输入出版社:");
    scanf("%s",book.publisher);

    printf("数据录入完毕!\n");
    
    printf("书名:%s\n",book.title);
    printf("作者:%s\n",book.author);
    printf("售价:%.2f\n",book.price);
    printf("出版日期:%d\n",book.date);
    printf("出版社:%s\n",book.publisher);
    return 0;
}

四、初始化结构体变量

初始化一个变量和数组:
 int a = 520;
 int arr[5] = {1,2,3,4,5}
 
 初始化一个结构体变量:
 struct Book book = {
    "《带你学C带你飞》",
    "小甲鱼",
    48.8,
    20171111,
    "清华大学出版社"
 };

五、初始结构体的指定原值

其语法和数组制定初始化元素类似,不过结构体指定初始化成员使用点号(.)运算符和成员名
 
 比如我们可以让程序只初始化Book的price成员:
 struct Book book = {.price = 48.8};
 
 还可以不按结构体声明的成员顺序进行初始化:
 struct Book book = {
    .publisher = "清华大学出版社",
    .price = 48.8,
    .date = 20171111
 }

六、算一算

int main(){
    struct A{
        char a;
        int b;
        char c;
    } a = {'x',520,'0'};
    
    printf("size of a = %d\n",sizeof(a));//size of a = 12
    return 0;
}
//不应该是1+4+1=6吗?怎么会是12
//这是编译器对结构体的成员进行内存对齐后的结果。
//说白了,内存对齐就是让CPU可以更快的读取和处理数据的方式。

int main(){
    struct A{
        char a;
        char c;
        int b;
    } a = {'x','0',520};
    
    printf("size of a = %d\n",sizeof(a));//size of a = 8
    return 0;
}

七、结构体嵌套

struct Date{
    int year;
    int month;
    int day;
};
struct Book{
    char title[128];
    char author[40];
    float price;
    struct Date date;//一个结构体作为另外一个结构体的成员
    char publisher[40];
} book1 = {
    "《带你学C带你飞》",
    "小甲鱼",
    48.8,
    {2017,11,11},
    "清华大学出版社"
};

int main(){
    printf("书名:%s\n",book1.title);
    printf("作者:%s\n",book1.author);
    printf("售价:%.2f\n",book1.price);
    printf("出版日期:%d-%d-%d\n",book1.date.year,book1.date.month,book1.date.day);
    printf("出版社:%s\n",book1.publisher);
    return 0;
}

八、结构体数组

  • 第一种方法是在申明结构体的时候进行定义
 struct 结构体名称{
 结构体成员;
 } 数组名[长度];
  • 第二种方法是先申明一个结构体类型(比如上面Book),在用此类型定义一个结构体数组
 struct 结构体名称{
    结构体成员;
 };
 struct 结构体名称 数组名[长度];

初始化结构体数组:

struct Book{
    char title[128];
    char author[40];
    float price;
    unsigned int date;
    char publisher[40];
};
 
struct Book book[3] = {
    {"《零基础入门学习Python》","小甲鱼",49.5,20161111,"清华大学出版社"},
    {"《零基础入门学习Scratch》","不二如是",49.9,2017101,"清华大学出版社"},
    {"《带你学C带你飞》","小甲鱼",49.5,20171111,"清华大学出版社"}
}

九、结构体指针

指向结构体变量的指针叫做结构体指针。

 struct Book *pt;
 pt = &book;
 
 通过结构体指针访问结构体成员又两种方法:
 第一种:(*结构体指针).成员名
 第二种:结构体指针->成员名

十、传递结构体变量

int main(){
    struct Test{
        int x;
        int y;
    } t1,t2;
    t1.x = 3;
    t1.y = 4;
    
    t2 = t1;//两个结构体变量之间是可以相互赋值的,但是结构体类型必须一样
    
    printf("t2.x=%d,t2.y=%d",t2.x,t2.y);
    return 0;
}
struct Date{
    int year;
    int month;
    int day;
};
struct Book{
    char title[128];
    char author[40];
    float price;
    struct Date date;
    char publisher[40];
};
struct Book getInput(struct Book book){
    printf("请输入书名:");
    scanf("%s",book.title);
    printf("请输入作者:");
    scanf("%s",book.author);
    printf("请输入售价:");
    scanf("%f",&book.price);
    printf("请输入出版日期:");
    scanf("%d-%d-%d",&book.date.year,&book.date.month,&book.date.day);
    printf("请输入出版社:");
    scanf("%s",book.publisher);
    return book;
}

void printBook(struct Book book){
    printf("书名:%s\n",book.title);
    printf("作者:%s\n",book.author);
    printf("售价:%.2f\n",book.price);
    printf("出版日期:%d-%d-%d\n",book.date.year,book.date.month,book.date.day);
    printf("出版社:%s\n",book.publisher);
}

int main(){
    struct Book b1,b2;
    
    printf("请输入第一本书的信息...\n");
    b1 = getInput(b1);
    
    printf("请输入第二本书的信息...\n");
    b2 = getInput(b2);
    
    printf("录入完毕,现在开始打印验证...\n\n");
    
    printf("打印第一本书的信息...\n");
    printBook(b1);
    
    printf("\n\n");
    
    printf("打印第二本书的信息...\n");
    printBook(b2);
    return 0;
}

十一、传递指向结构体变量的指针

struct Date{
    int year;
    int month;
    int day;
};
struct Book{
    char title[128];
    char author[40];
    float price;
    struct Date date;
    char publisher[40];
};
void getInput(struct Book *book){
    printf("请输入书名:");
    scanf("%s",book->title);
    printf("请输入作者:");
    scanf("%s",book->author);
    printf("请输入售价:");
    scanf("%f",&book->price);
    printf("请输入出版日期:");
    scanf("%d-%d-%d",&book->date.year,&book->date.month,&book->date.day);
    printf("请输入出版社:");
    scanf("%s",book->publisher);
}

void printBook(struct Book *book){
    printf("书名:%s\n",book->title);
    printf("作者:%s\n",book->author);
    printf("售价:%.2f\n",book->price);
    printf("出版日期:%d-%d-%d\n",book->date.year,book->date.month,book->date.day);
    printf("出版社:%s\n",book->publisher);
}

int main(){
    struct Book b1,b2;
    
    printf("请输入第一本书的信息...\n");
    getInput(&b1);
    
    printf("请输入第二本书的信息...\n");
    getInput(&b2);
    
    printf("录入完毕,现在开始打印验证...\n\n");
    
    printf("打印第一本书的信息...\n");
    printBook(&b1);
    
    printf("\n\n");
    
    printf("打印第二本书的信息...\n");
    printBook(&b2);
    return 0;
}

十二、动态申请结构体

使用malloc函数为结构体分配存储空间。