【408篇】C语言笔记-第八章(结构体及C++引用)
admin
2024-02-29 21:33:20
0

第一节:结构体对齐-结构体数组

1. 结构体的定义和初始化,结构体数组

C语言提供结构体来管理不同类型的数据组合。例如:一名学生有学号、姓名、性别、年龄、地址等属性。如果针对学生的这些属性单独定义一个变量,那么在有多名学生时,变量就难以分清。这是就需要用到结构体。

声明结构体类型的一般形式:

struct 结构体名{成员列表};

先声明结构体名,再定义变量名。

struct student s1;
struct student s2;
#include struct student{int num;char name[20];char sex;int age;float score;char addr[30];
};   // 结构体类型声明,注意最后一定要加分号int main() {struct student s={1001,"lele",'M',20,85.4,"beijing"};printf("%d %s %c %d %f %s\n",s.num,s.name,s.sex,s.age,s.score,s.addr); // 定义及初始化printf("-------------------------\n");struct student sarr[3];int i;for(i=0;i<3;i++){scanf("%d%s %c%d%f%s",&sarr[i].num,sarr[i].name,&sarr[i].sex,&sarr[i].age,&sarr[i].score,sarr[i].addr);}for (i=0;i<3;i++) {printf("%d %s %c %d %f %s\n",sarr[i].num,sarr[i].name,sarr[i].sex,sarr[i].age,sarr[i].score,sarr[i].addr);}return 0;
}
F:\Computer\Project\practice\8\8.1-statement\cmake-build-debug\8_1_statement.exe
1001 lele M 20 85.400002 beijing
-------------------------
1002 lala M 25 86.4 tianjin
1003 lilei W 23 87.2 shanxi
1004 hubing M 22 88.3 qingdao
1002 lala M 25 86.400002 tianjin
1003 lilei W 23 87.199997 shanxi
1004 hubing M 22 88.300003 qingdao进程已结束,退出代码为 0

对比java中的对象来理解此部分。

结构体类型声明要放在main函数之前,这样main函数中才可以使用这个结构体,工作中往往把结构体声明放在头文件中。

如果结构体变量已经定义,那么只能对它的每个成员单独赋值,如s.num=1005

2. 结构体对齐

结构体的大小必须是其最大成员的整数倍

#include struct student_type1{double score;  // double是一种浮点型,占8个字节short age;  // short是短整型,占2个字节
};
struct student_type2{double score;int height;short age;
};
struct student_type3{int height;char sex;short age;
};int main() {struct student_type1 s1;struct student_type2 s2;struct student_type3 s3;printf("s1 size=%d\n",sizeof(s1));printf("s2 size=%d\n",sizeof(s2));printf("s3 size=%d\n",sizeof(s3));retu             rn 0;
}
F:\Computer\Project\practice\8\8.1-alignment\cmake-build-debug\8_1_alignment.exe
s1 size=16
s2 size=16
s3 size=8进程已结束,退出代码为 0

分析:对于student_type1,因为最大成员double占8个字节,所以最少需要16个字节。student_type2同理。student_type3最大成员int占了4个字节,所以最少需要8个字节。

思考:为什么要对齐?

为了CPU更高效取内存数据。有时,我们可以通过变换属性的位置来调节占用空间的大小,比如将char和short放到一起,他们会共同占用4个字节。

第二节:结构体指针与typedef的使用

1. 结构体指针

一个结构体变量的指针就是该变量所占据的内存段的起始地址,可以设置一个指针变量,用它指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址,指针变量也可以用来指向结构体数组中的元素,从而能够通过结构体指针快速访问结构体内的每个成员。

#include struct student{int num;char name[20];char sex;
};int main() {struct student s={1001,"wangle",'M'};struct student sarr[3]={1001,"lilei",'M',1002,"shangsan",'W',1003,"lili",'M'};struct student *p;  // 定义结构体指针int num;p=&s;printf("%d %s %c\n",p->num,p->name,p->sex);p=sarr;printf("%d %s %c\n",(*p).num,(*p).name,(*p).sex);  // 方式一,获取成员printf("%d %s %c\n",p->num,p->name,p->sex); // 方式二,获取成员printf("-------------------------\n");p=p+1;printf("%d %s %c\n",p->num,p->name,p->sex);p=p+1;  // 注意指针已经在上面的基础上偏移了,所以还是加1printf("%d %s %c\n",p->num,p->name,p->sex);return 0;
}
F:\Computer\Project\practice\8\8.2-morphology-pointer\cmake-build-debug\8_2_morphology_pointer.exe
1001 wangle M
1001 lilei M
1001 lilei M
-------------------------
1002 shangsan W
1003 lili M进程已结束,退出代码为 0

解析:p就是一个结构体指针,可以对结构体s取地址并赋给p,p就可以访问结构体每个成员。而数组名存储的是数据首地址,所以将sarr赋给p。

“.”成员选择器的优先级高于“*”运算符,所以需要加括号,通过*p得到sarr[0],然后获取对应成员。

2. typedef的使用

可以使用typedef声明新的类型名来代替已有的类型名。相当于取别名。

#include // 结构体指针
typedef struct student{int num;char name[20];char sex;
}stu,*pstu;   // 对定义的student结构体取别名typedef int INTEGER;  // 对已有的类型取别名int main() {stu s={1001,"wangle",'M'};pstu p;p=&s;printf("p->num=%d,p->name=%s,p->sex=%c\n",p->num,p->name,p->sex);INTEGER i=10;printf("i=%d\n",i);return 0;
}
F:\Computer\Project\practice\8\8.2-typedef\cmake-build-debug\8_2_typedef.exe
p->num=1001,p->name=wangle,p->sex=M
i=10进程已结束,退出代码为 0

解析:使用stu定义结构体变量和使用struct student定义结构体变量是等价的。使用INTEGER定义变量i和使用int定义变量i是等价的。pstu等价于struct student*,所以p是结构体指针变量。

第三节:C++引用和C++布尔类型

1. C++的引用

对于C++,首先新建源文件时,名字需要叫main.cpp,以cpp后缀结尾

C++引用能够使编码更加方便快捷。

#include 
// C语言代码
void modify_num(int *b){*b=*b+1;
}int main() {int a=10;modify_num(&a);printf("after modify_num a=%d\n",a);return 0;
}
#include 
// C++代码
void modift_num(int &b){b=b+1;
}int main() {int a=10;modift_num(a);printf("after modift_num a=%d\n",a);return 0;
}

以上两种编码,结果均为:

F:\Computer\Project\practice\8\8.3-c++_code\cmake-build-debug\8_3_c___code.exe
after modift_num a=11进程已结束,退出代码为 0

子函数内修改主函数的一级指针变量。

#include 
// C语言代码
void modify_pointer(int **p,int *q){*p=q;
}
int main() {int *p=NULL;int i=10;int *q=&i;modify_pointer(&p,q);  // p是一级指针,再取地址就是二级指针printf("after modify_pointer *p=%d\n",*p);return 0;
}
#include 
// C++代码
void modify_pointer(int *&p,int *q){p=q;
}int main() {int *p=NULL;int i=10;int *q=&i;modify_pointer(p,q);printf("after modify_pointer *p=%d\n",*p);return 0;
}

以上两种编码,结果均为:

F:\Computer\Project\practice\8\8.3-class_a_c\cmake-build-debug\8_3_class_a_c.exe
after modify_pointer *p=10进程已结束,退出代码为 0

说明:p本身就是指针变量,在传递时就是二级指针。

2. C++的布尔类型

布尔类型在C语言中没有,是C++的,有true和false。

#include int main() {bool a=true;bool b=false;printf("a=%d,b=%d\n",a,b);return 0;
}
F:\Computer\Project\practice\8\8.3-bppl\cmake-build-debug\8_3_bppl.exe
a=1,b=0进程已结束,退出代码为 0

说明:在c++中,true为1,false为0。

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...