【408篇】C语言笔记-第八章(结构体及C++引用)

news/2024/4/25 7:39:09/文章来源:https://blog.csdn.net/weixin_45842494/article/details/128105069

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

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

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

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

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

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

struct student s1;
struct student s2;
#include <stdio.h>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 <stdio.h>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 <stdio.h>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 <stdio.h>// 结构体指针
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 <stdio.h>
// 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 <stdio.h>
// 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 <stdio.h>
// 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 <stdio.h>
// 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 <stdio.h>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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_38876.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【站内题解】十六道csdn每日一练Python题解

文章目录题目一&#xff1a; 游乐园的门票1. 问题描述2. 输入描述3. 输出描述4. 示例4.1 输入4.2 输出5. 答案5.1 解法一5.2 解法二题目二&#xff1a;小桥流水人家1. 问题描述2. 输入描述3. 输出描述4. 示例4.1 输入4.2 输出5. 答案题目三&#xff1a;小艺读书1. 问题描述2. 输…

Wordpress模板主题中functions.php常用功能代码与常用插件(持续收集整理)

用Wordpress建站的初学者一定会需要用到的Wordpress模板主题中functions.php常用功能代码与常用插件。慢慢持续收集整理....... 目录 一、Wordpress模板主题中functions文件常用的代码 二、Wordpress自定义字段的设定与调用代码&#xff08;系统常规自定义字段&#xff09; …

ESP32基础应用之LVGL基础

文章目录1 实验目的1.1 参考文章2 实验工具3 准备工作3.1 搭建ESP32开发环境3.2 克隆lv_port_esp32工程4 配置lv_port_esp32工程5 实验验证6 使用过程遇到的问题6.1 触摸功能点击屏幕位置不对1 实验目的 本实验为使用ESP32实现LVGL&#xff08;轻量级的嵌入式图形库&#xff0…

消息队列概述与扩展

一、消息队列的特性 与业务解藕&#xff1a;一个具有普适性质的消息队列组件不需要考虑上层的业务模型&#xff0c;只做好消息的分发就可以了&#xff0c;上层业务的不同模块反而需要依赖消息队列所定义的规范进行通信。FIFO&#xff1a;先投递先到达的保证是一个消息队列和一…

计算机组成原理习题课第三章-2(唐朔飞)

计算机组成原理习题课第三章-2&#xff08;唐朔飞&#xff09; ✨欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ &#x1f52e;本文由京与旧铺原创&#xff0c;csdn首发&#xff01; &#x1f618;系列专栏&#xff1a;java学习 &#x1f4bb;首发时间&#xff1a;&…

梦开始的地方——C语言柔性数组

文章目录柔性数组什么是柔性数组&#xff1f;柔性数组的使用柔性数组的优点柔性数组 什么是柔性数组&#xff1f; 在C99中&#xff0c;结构体最后一个元素它允许是一个未知大小的数组&#xff0c;这就叫做柔性数组成员。 这个概念听起来可能有点不可以思议&#xff0c;但它的…

第三十九篇 自定义指令 - directive

前面讲了关于在Vue中如何来进行封装swiper组件的内容&#xff0c;本篇内容讲到使自定义组件&#xff0c;讲这块内容也是同样为了后续再次回顾封装swiper组件变化做铺垫内容&#xff0c;那么什么是自定义指令&#xff0c;在前面的内容讲过了好些常用的指令&#xff0c;如 v-modl…

【linux】环境基础开发工具使用

1.vim编辑器 vim中最常用的是三种模式&#xff1a;命令模式&#xff0c;底行模式&#xff0c;插入模式。 命令模式(Normal mode)命令模式是我们第一次vim打开文件的样子&#xff08;默认模式&#xff09;&#xff0c;这里控制屏幕光标的移动&#xff0c;字符、字或行的删除&…

考CISAW的N个理由!

随着信息科技的飞速发展&#xff0c;互联网的普及&#xff0c;面对信息安全的严峻局势&#xff0c;网络信息安全显得尤为重要&#xff0c;同时近些年来&#xff0c;国家也相继出台一些政策&#xff0c;并推出一些国家认证的资格证书&#xff0c;CISAW认证就是专门针对信息安全保…

DPDK代码目录结构

DPDK功能结构 DPDK工程目录内容 dpdk-stable-18.11.11]# ls app buildtools devtools drivers GNUmakefile lib MAINTAINERS meson.build mk README usertools build config doc examples kernel license Makefile meson_opt…

使用React.ts创建一个密码生成器的简单示例

目录密码生成器DemoFeature知识点React TypeScript —— Function Components为元素(::before/::after)绑定点击事件React如何正确定义对象数组在React中设置复选框check属性三目运算符实现React动态绑定class和style参考资料密码生成器Demo 使用密码生成器工具创建随机密码。P…

GIT技巧

目录 基础命令 commit 、branch merge rebase 高级特性 自由修改提交树 cherry-pick rebase 远程仓库命令 基础命令 commit 、branch Git Commit Git 仓库中的提交记录保存的是你的目录下所有文件的快照&#xff0c;就像是把整个目录复制&#xff0c;然后再粘贴一样…

流媒体传输 - HLS 协议

HLS 全称是 HTTP Live Streaming&#xff0c;是一个由 Apple 公司提出的基于 HTTP 的媒体流传输协议&#xff0c;用于实时音视频流的传输。目前 HLS 协议被广泛的应用于视频点播和直播领域。 概述 原理介绍 通过将整条流切割成一个小的可以通过 HTTP 下载的媒体文件&#xff…

Spirng 痛苦源码学习(二)——手写spring大致总框架(一)

文章目录前言一、总体步骤如下1、spring 文件夹2、myProject 文件夹二、主要coding1、配置文件2、容器3、一些spring中的重要的注解4、项目中的使用5.重要的bean定义信息6、postProcessor重要&#xff0c;前置通知和后置主要项目的截图前言 本文主要基于spring的注解的方式完成…

Python的10个编程技巧,你不一定都知道

文末有Python资料下载 1. 原地交换两个数字 Python 提供了一个直观的在一行代码中赋值与交换&#xff08;变量值&#xff09;的方法&#xff0c;请参见下面的示例&#xff1a; 赋值的右侧形成了一个新的元组&#xff0c;左侧立即解析&#xff08;unpack&#xff09;那个&…

leetcode-每日一题-1758-生成交替二进制字符串的最少操作数(简单,数学思想)

这道题标记为简单题是正常的&#xff0c;因为当你想到0或者1开头的时候就已经结束了看看我的分析 那么知道这个信息之后就很简单了&#xff0c;加上我们的位运算符号^作为标记即可&#xff0c;大家看看代码实现 1758. 生成交替二进制字符串的最少操作数 难度简单88收藏分享切换…

Mysql基础知识篇(二)

1.UNION 与 UNION ALL 的区别&#xff1f; 如果使用 UNION&#xff0c;会在表链接后筛选掉重复的记录行如果使用 UNION ALL&#xff0c;不会合并重复的记录行从效率上说&#xff0c;UNION ALL 要比 UNION 快很多&#xff0c;如果合并没有刻意要删除重复行&#xff0c;那么就使…

Java基于springboot+vue的摄影作品展示交流系统 计算机毕业设计

随着时代的发展&#xff0c;人们的精神世界也在不断的丰富&#xff0c;尤其是在当下电子设备发展迅速的背景下&#xff0c;人们通过数码相机或者手机随后就可以拍下每一个美丽的瞬间&#xff0c;但是人们更希望将这些摄影作品传到网上和更多的人进行分享&#xff0c;同时也希望…

电脑键盘功能基础知识,快速入门,抓住这份详细教程

在互联网生活发达的今天&#xff0c;电脑已经成为了学习工作的必备工具。而用来操作电脑的关键&#xff0c;就是我们经常使用的键盘和鼠标。最近有不少的小伙伴来私信小编&#xff0c;希望小编做一个电脑键盘功能基础知识介绍的详细教程。这不&#xff0c;小编应大家要求&#…

用匠心创造可期未来!与广州流辰信息科技一起携手创佳绩!

当今社会世界经济一体化趋势逐渐明朗化&#xff0c;竞争也愈发激烈&#xff0c;同时&#xff0c;这也是一个机遇与挑战并存的开放社会。在机遇面前&#xff0c;作为企业&#xff0c;要紧紧抓住机遇&#xff0c;顺势而为&#xff0c;创造辉煌佳绩&#xff1b;在挑战面前&#xf…