【C语言】结构体类型

目录

  • struct结构体数据类型
    • 前言
    • 结构体的声明
    • 没有成员变量的结构体
    • 访问结构体成员
    • 结构作为函数参数
    • 结构体的指针
    • 结构体数组
    • 结构体的内存计算

struct结构体数据类型

前言

我们知道,在C语言中有一些基本的数据类型,如 char , int, float, long ,double, string 等等数据类型,他们可以表示一些事物的基本属性,但是当我们想表达一个事物的全部或部分属性时,这时候再用单一的基本数据类型明显就无法满足需求了,这时候C提供了一种自定义数据类型,他可以封装多个基本数据类型,这种数据类型叫结构体,英文名称struct,可以使用struct关键词声明结构体


结构体的声明

结构体的声明语法如下

struct [structure tag] /*结构体的标签*/{

   member definition; /*零个或多个成员变量的定义*/
   member definition;
   ...
   member definition;
} [one or more structure variables];  /*一个或多个结构体变量的定义*/

结构体标签(structure tag)是可选的,但是推荐还是写上,这样使得代码更加规范清晰,成员变量的定义一般为基本数据类型,如 int age; char name[10]等,成员变量之间使用;隔开,最后一个成员变量后面的;可选, 如下面定义一个图书信息的结构体变量

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

没有成员变量的结构体

我们也可以定义一个空的结构体,有时候我们需要某一个结构体数据类型,但是暂时又不知道如何填充里面的成员变量,我们可以有如下定义

struct Books 
{
  //TODO
} book;

访问结构体成员

定义完结构体积后接下来就是去访问它并给他赋值,为了访问一个结构体成员变量,我们可以使用成员操作符(.) 成员访问运算符被编码为结构变量名称和我们希望访问的结构成员之间的句点(.)如下所示的完整代码


#include 
#include 

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

int main( ) 
{

   struct Books Book1;        /* Declare Book1 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 = 459;


   /* 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);

   return 0;
}

输出

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 459

结构作为函数参数

同样的,我们也可以像基本数据类型一样,把结构体作为函数的参数,如下所示我们定义一个打印结构体的函数

#include 
#include 

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

void printBook( struct Books book );

int main( ) 
{

   struct Books Book1;        /* Declare Book1 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 = 459;

	printBook( Book1 );//函数声明
	
	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 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 459

结构体的指针

我们也可以定义结构体指针,像这样

struct Books *struct_pointer;

现在你可以存放结构体变量的地址在结构体变量指针中.和基本数据类型的变量一样,我们使用&操作符取一个变量的地址

struct_pointer = &Book1;

接下来就是使用结构体指针去访问成员变量了,访问的操作符我们由原来的.变为->,没错,这个是不是很形象呢?完整代码如下

#include 
#include 

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

//这里printBook函数在main函数前,可以不用声明
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);
}

int main( ) 
{

   struct Books Book1;        /* Declare Book1 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 = 459;
}

输出结果和之前完全相同,这里就不再写出来了,大家可以自己上机实验。

结构体数组

例如

struct Books books[2];

定义一个结构体数组struct Books books;

strcpy( books[0].title, "C Programming");
strcpy( books[1].title, "Telecom Billing");

分别为数组中结构体 book [ 0 ] 的 title 域和 book [ 1 ] 的 title 域赋值。

同理为其他域赋值也如此。


结构体的内存计算

没错,估计你已经知道了,结构体变量的所占用内存空间的大小为各成员变量所占空间之和,如下所示的结构体占用内存大小在注释里面

struct Books {
    char title[50];
    char author[50];
    char subject[100];
    int book_id;
};
int main() {
    printf("%d\n", (int) sizeof(struct Books)); /*204*/
    return 0;
}

相 见 就 是 【 猿 分 】
.
感谢您阅读完此文章
.
❓ 希望能够对你有所帮助
.
❌ 如果文章中有错误的地方请指正 ✔️
.
感谢支持,一起加油,共同进步

你可能感兴趣的:(C语言基础,c语言,开发语言,后端)