结构体的基本认知01

 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 等输入输出函数中使用的格式控制字符串的一部分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值