C语言:结构体

时间:2021-07-14
本文章向大家介绍C语言:结构体,主要包括C语言:结构体使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

这是很基础的教程,我只是写给自己看,作为一个学习笔记记录一下,如果正在阅读的你觉得简单,请不要批评,可以关掉选择离开

如何学好一门编程语言

  • 掌握基础知识,为将来进一步学习打下良好的基础。
  • 上机实践,通过大量的例题学习怎么设计算法,培养解题思路。
  • 养成良好的编码习惯,注释一定要写,要不然保你一周后自己写的代码都不认识了。

C语言中的数组 定义为存储 相同类型的数据。

C语言中的结构 允许存储不同类型的数据,定义结构的语句为:

struct 结构体标签{ 
    变量定义;
    变量定义;
    ...
} 结构变量 列表;

举例

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

在一般情况下,结构体标签、变量定义、结构体变量 这 3 部分至少要出现 2 个

//没有标明标签
struct
{
    int a;
    char b;
    double c;
} s1;

//标签被命名为SIMPLE,没有声明变量
struct SIMPLE
{
    int a;
    char b;
    double c;
};
//用SIMPLE标签的结构体,另外声明了结构体变量t1、t2、t3
struct SIMPLE t1, t2[20], * t3;

//用typedef创建新类型
typedef struct
{
    int a;
    char b;
    double c;
} Simple2;
//现在可以用Simple2作为类型声明新的结构体变量
Simple2 u1, u2[20], * u3;

结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,而通常这种指针的应用是为了实现一些更高级的数据结构如链表和树等。

//此结构体的声明包含了其他的结构体
struct COMPLEX
{
    char string[100];
    struct SIMPLE a;
};
 
//此结构体的声明包含了指向自己类型的指针
struct NODE
{
    char string[100];
    struct NODE *next_node;
};

如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明,如下所示:

struct B;    //对结构体B进行不完整声明
 
//结构体A中包含指向结构体B的指针
struct A
{
    struct B *partner;
    //other members;
};
 
//结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明
struct B
{
    struct A *partner;
    //other members;
};

结构体变量的初始化

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

#include<stdio.h>

struct Books{
    char title[50];
    char author[50];
    char subject[100];
    int book_id;
} book = {"C语言","RUNOOB","编程语言",123456};

int main() {
    printf("title:%s\n author:%s\nsubject:%s\nbook_id:%d\n", book.title, book.author, book.subject, book.book_id);
    return 0;
}
title:C语言
 author:RUNOOB
subject:编程语言
book_id:123456
结果

访问结构成员使用 . 。例如:

结构体变量.成员名

结构作为函数参数

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

#include <stdio.h>
#include <string.h>

// 声明结构体类型Books
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;

    printBook(Book1);    /* 将结构变量Book1 作为参数传入函数*/
    printBook(Book2);    /* 将结构变量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;

    printBook(&Book1);    /* 通过传 Book1 的地址来输出 Book1 信息 */
    printBook(&Book2);    /* 通过传 Book2 的地址来输出 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
结果

参考

菜鸟教程

原文地址:https://www.cnblogs.com/LXP-Never/p/15010259.html