1.结构体类型的概念
结构体是一种构造类型,它是由若干成员组成的。其成员可以是一个基本数据类型,也可以是一个构造类型。既然结构体是一种新的类型,就需要先对其进行构造,这里称这种操作为声明一个结构体。声明结构体的过程就好比生产商品的过程,只有商品生产出来才可以使用该商品。假如程序中要用这样一个商品类型,该如何定义该类型。
这就需要独自声明一个结构体。关键字——struct,其一般形式如下:
struct 结构体名
{
成员列表
};
2.结构体变量的定义
声明一个结构体表示的是创建一种新的类型名,要用新的类型名再定义变量
2.1定义结构体类型(注意大括号结尾要加上分号“;”)
下面声明一个学生基本信息的结构体类型 告诉系统这是个结构体
struct Student //一般结构体名首字母要大写
{
char name[30]; //每一项元素后都要加上分号
char sex[10];
int num;
int age;
double score; //双精度浮点型( double 类型)使用 %lf 是 Double类型占位符
char addr[30];
};
2.2结构体变量的定义 (3种)
(1)先声明结构类型,再定义变量
2.1中声明了一个Student结构体类型,接下来再定义两个结构体变量:
struct Student stud1;
struct Student stud2; //指定stud1,stud2为特定的结构体类型的结构体变量
(2)在声明结构体类型时,同时定义变量
struct Student
{
char name[30];
char sex[10];
int num;
int age;
double score; //双精度浮点型( double 类型)
char addr[30];
}stu1,stu2; //定义结构体变量(3)直接定义结构体变量
struct
{
char name[30];
char sex[10];
int num;
int age;
double score; //双精度浮点型( double 类型)
char addr[30];
}stu1,stu2;可以看出这种方式没有给出结构体名称Student
--------------------------struct Student 的意义就相当于我们熟知的int----------------------------
3.结构体变量的引用
在引用结构的成员时,可以在结构的变量名后面加上成员运算符“.”和成员的名字
结构变量成员的形式:stud1.score=99.5;
stud1.num=123;
struct Student stud1;
struct Student stud2={"Mike","woman",321,23,98,"上海"};
strcpy(stud1.name,"李华");
strcpy(stud1.sex,"男");
stud1.num=123;
stud1.age=20;
stud1.score=99.5;
strcpy(stud1.addr,"Beijing");
3.1引用结构体变量
本实例声明结构体类型为学生,通过两种方式给结构体变量进行赋值,最后将结构体变量中保存的信息进行输出。
#include <stdio.h>
#include <string.h>
struct Student
{
char name[30];
char sex[10];
int num;
int age;
double score; //双精度浮点型( double 类型)
char addr[30];
};
int main()
{
int a;
struct Student stud1;
struct Student stud2={"Mike","woman",2024002,23,98,"上海"}; //对变量stud2中的成员赋值
a=20;
strcpy(stud1.name,"李华");//同样,换种方式对stud1中的成员赋值
strcpy(stud1.sex,"男");
stud1.num=2024001;
stud1.age=a;
stud1.score=99.5;
strcpy(stud1.addr,"Beijing");
printf("姓名:%s\n性别:%s\n学号:%d\n年龄:%d\n分数:%lf\n地址:%s\n\n",
stud1.name,stud1.sex,stud1.num,stud1.age,stud1.score,stud1.addr);
printf("姓名:%s\n性别:%s\n学号:%d\n年龄:%d\n分数:%lf\n地址:%s\n",
stud2.name,stud2.sex,stud2.num,stud2.age,stud2.score,stud2.addr);
return 0;
}
4.关键字typedef的应用
4.1应用关键字typedef
此时我们将struct Color{int Red}看成是一个数据类型,但是因为并没有给出别名,直接用Color定义变量是不行的。如Color test;,不能直接这样定义变量test。但struct Color test;这样是可行的。
typedef struct Color
{
int Red;
};
4.2在上面结构体定义的基础上加上别名M
在上面结构体定义的基础上加上别名M,此时的结构体Color有别名M,故可以用M定义Color的结构体变量。用Color不能直接定义,需要在前面加struct,如struct Color test;。
typedef struct Color
{
int Red;
}M;
4.3减去结构体名Color
减去结构体名Color ,但是若是直接使用M来定义该结构体类型的变量也是可以的。如M test;。(常用)
typedef struct
{
int Red;
}M;
#include <stdio.h>
int main (void) {
int a[] = {2,52,'a','b'};
typedef struct _GPIO_t{
int in;
int out;
int type;
int value;
}GPIO_t;
GPIO_t *GPIOA =(GPIO_t *)a;//指针类型的变量
/*
* 等同于GPIO_t *GPIOA = (GPIO_t *) &a;
* 因为数组的首地址为 可以表示为 a,&a,&a[0]
*/
printf("%d \n",GPIOA->in);//这里的 -> 用来表示指向这个寄存器的指针
printf("%d \n",GPIOA->out);
printf("%c \n",GPIOA->type);
printf("%c \n",GPIOA->value);
}
定义结构体时并不会开辟内存。在C语言中,结构体是一种用户定义的数据类型,用于将不同的数据类型组合在一起,形成一种新的数据类型。这种数据类型在定义时并不分配内存空间,只有在定义结构体变量时,系统才会根据结构体的定义和成员的大小来分配相应的内存空间。结构体的大小是所有成员大小之和,这包括了每个成员所占用的内存空间以及可能的内存对齐需求。
结构体的定义仅仅是一种数据类型的声明,它告诉编译器存在这样一种数据类型,但并不实际创建任何内存空间。只有当具体创建结构体变量时,如通过定义结构体变量structBook book1, book2;
,系统才会为这些变量分配内存空间。此外,如果使用结构体指针,如structBook* ptr;
,则需要显式地使用malloc
等函数来分配内存空间。
这种机制允许程序员根据需要创建任意数量的结构体变量,每个变量都有其自己的内存空间,但结构体类型本身的定义并不占用任何内存空间,直到具体的变量被创建。
百分号 %lf 在C语言中用于输出双精度浮点型( double 类型)的数值,并且在输出后会自动换行
解释:
% 是格式化的开始符号。
l 表示后面跟着的 f 是一个 double 类型(长浮点数)的占位符。
f 表示要以小数点格式输出一个浮点数。
因为中间没有其他字符,所以 lf 紧挨着,表示这是一个 double 类型的浮点数输出格式。
所以,当你在C语言中使用 %lf 时,你告诉编译器要输出一个 double 类型的数值,并且在数值后面会自动换行。这是在 printf 或 scanf 等输入输出函数中使用的格式控制字符串的一部分。