C语言学习笔记---结构体的定义和初始化

415 阅读4分钟

「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战」。

  在C语言中结构体通常用来将不同类型的变量打包在一起,方便对对象的统一管理。

结构体定义

  要使用结构体时,首先要进行结构体的声明。声明的形式如下:

struct 结构体名 {
     结构体所包含的变量
     };

  比如现在要描述一本书的标题,作者,价格。声明格式如下:

struct book{
		char title[30];
		char author[30];
		float value;
	};

  用字符数组来存储书的标题和作者,用浮点型来存储书的价格。声明完成之后,此时在内存中并没有分配存储空间。因为结构体也是一种数据类型,它和char、int、float等类型一样属于数据类型。

  声明完结构体之后,就告诉了计算机,我要使用的数据类型是结构体类型。在后面操作这个对象的时候,就按照结构体的方式来操作。此时就相当于只写了一个 int ,并没有定义变量。

  下面开始定义结构变量。

struct book b1;

  此时就在内存中创建了一个结构类型的变量b1,系统就会在内存中给b1分配一个存储空间。

  在上面将结构体的声明和变量的定义分成了两部分,也可以使用一起实现。

struct book{
		char title[30];
		char author[30];
		float value;
	} b1;

  用这种方式就可以声明一个结构类型,同时定义了一个结构变量b1。如果还想在定义一个变量b2,可以在初始化的时候定义。也可以单独定义。

  单独定义:

struct book b2;

  在声明的时候时候定义

struct book{
		char title[30];
		char author[30];
		float value;
	} b1,b2;

  如果这个结构体不需要再定义其他的变量,那么在声明时可以省略结构体名,比如上面的代码就可以简写为:

struct {
		char title[30];
		char author[30];
		float value;
	} b1,b2;

  将结构体名book直接省略掉,但是这样的话,以后如果再想单独定义一个变量b3就不能实现了。

结构体初始化

方法一:

  初始化上面定义的两个变量,在定义的时候直接初始化。

   struct book{
		char title[30];
		char author[30];
		float value;
	};
    struct book b1 = {"语文","张三",19.8};
	struct book b2 = {"数学","李四",21.3};

  初始化的时候,各个项之间用逗号隔开,按照定义时的顺序,依次填入各个成员的值。

方法二:

  可以每个成员单独初始化

struct book{
		char *title;
		char *author;
		float value;
	} b1,b2;

	b1.value = 19.8;
    b1.title = "语文";
    b1.author = "张三";
    
    b2.title = "数学";
    b2.value = 21.3;
    b2.author = "李四";

  定义好变量之后,给每个成员单独初始化,初始化的时候可以不按照顺序来。在单独初始化的时候,这里要注意一下,需要将结构体声明中的的字符数组改为指针。如果还是用字符数组,那么在给数组赋值的时候,只能使用下标,一位一位的给数组中每个元素赋值。而不能将数组定义好之后,然后给数组的首地址一个字符串。字符数组只有在定义的时候,可以直接用字符串赋值。如下所示:

    char str[30] = "123";  //正确
	
	char str1[30];
	str1 = "abc";			//错误 

  如果需要给成员单独初始化,就需要将申明中的数组改为指针,如果不想修改的话,那么也可以在定义的时候,直接初始化。

方法三:

  在初始化的时候,可以直接使用结构成员运算符---点(.)访问结构体中的成员。这样的话就可以直接指定要向哪个成员赋值。可以不按照顺序来对成员进行赋值。

struct book{
		char title[30];
		char author[30];
		float value;
	} ;

	struct book b1={
					.value = 19.8,
    				.title = "语文",
    				.author = "张三"
					};
    
    struct book b2={
    				.title = "数学",
    				.value = 21.3,
    				.author = "李四"
					};

  在操作结构体中的对象时,也可以使用点(.)来访问。比如需要打印结构成员的信息时,可以使用下面的代码:

	printf("%s %s %f\r\n",b1.author,b1.title,b1.value);
	printf("%s %s %f\r\n",b2.author,b2.title,b2.value);

在这里插入图片描述

  在结构体变量后加一个点就可以直接访问变量中的具体成员。成员的操作方法和它对应的类型操作方法一样。