2022/12/1 结构体

news2025/2/25 21:01:14

结构体

声明结构体:

struct 结构体名

例如:struct student 其中,student又称为结构体标记

结构体可以拥有成员,例如:

struct student

{

int num;

int score;

char name[20]

};    注意,分号不可以少!

定义结构体变量

1、在声明类型的同时声明变量

struct student

{

int num;

int score;

char name[20]

}a,b;

2、不指定类型名定义变量(用的不多)

例如:

struct

{

int ……

}a,b;

注意:(1)结构体类型中的成员名可以与程序中的变量名相同,但二者不代表同一对象。例如,程序中可以另定义一个变量num,它与struct Student中的num是两回事,互不干扰。

结构体初始化与引用

例如:struct student

{int……}

a={100,“hello”……};

可以引用结构体变量中成员的值,引用方式为

结构体变量名 成员名

例如:a.num=100;

注意:不能企图通过输出结构体变量名来达到输出结构体变量所有成员的值。

(1)如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。只能对最低级的成员进行赋值或存取以及运算。如果在结构体 struct Student类型的成员中包含另一个结构体struct date类型的成员birthday,则引用成员的方式:

Sudent,num;

student.birthday.year:不能用a.birthday来访问变量中的成员birthday,因为birthday本身就是一个结构体变量!

(2)对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。例如:

student2.score= student1. score;(赋值运算)

sum=student1. score+student2. score;(加法运算)

student1.age++;(自加运算)

由于“.”运算符的优先级最高,因此student1.age++是对(student1.age)进行自加运算,而不是先对age进行自加运算。

(3)同类的结构体变量可以互相赋值,如:student1=student2;//假设student1和 student2已定义为同类型的结构体变量,这是整体赋值!

(4)可以引用结构体变量成员的地址,也可以引用结构体变量的地址。例如:scanf(" %d",&student1. num);

(输入student1.num的值)

printf(" %o",&student1);

(输出结构体变量student1的起始地址)

但不能用以下语句整体读入结构体变量,例如:scanf("%d,%s%c.%d,%f,%s\n",&student1);

结构体数组

一个结构体变量中可以存放一组有关联的数据(如一个学生的学号、姓名、成绩等数据)。如果有10个学生的数据需要参加运算,显然应该用数组,这就是结构体数组

(1)定义结构体数组一般形式是

struct 结构体名

{成员表列}数组名[数组长度];

先声明一个结构体类型(如struct Person),然后再用此类型定义结构体数组:结构体类型数组名[数组长度];

如:

struct Person leader[3];

//leader是结构体数组名

(2)对结构体数组初始化的形式是在定义数组的后面加上:

={初值表列};

如:                                                                 

struct stu

{

int num;

char name[20];

char sex;

float score;

}student[2]={{1,”li”,’m’,60},{2,”ai”,’f’,100}};

3、定义结构体之后赋值,可利用for循环结构

例如:struct stu

{

int num;int chinese

};

int main()

{

struct stu student[5];

......

for(i=0;i<5;i++)

{

scanf_s("%d%d",&stduent[i].num,&student[i].chinese);

}

}

指向结构体的指针

一个结构体变量的指针就是该变量所占内存空间的首地址,通过结构体指针变量即可访问到该结构体变量。

结构体指针变量定义的一般形式为:

struct 结构体名 *结构体指针变量名

如要说明一个指向student的指针变量p:struct student *p

或是struct date

{int tear,month,day;}*q;

注意,结构体变量也必须先赋值后才能使用,赋值是把结构体变量的首地址赋予该指针变量,不能把结构体名赋给它,例如:

struct student stu;

则 p=&stu 是正确的,注意不能写成p=&student,这是错误的 

结构体成员的三种引用方式

  (*结构体指针变量).成员名

或者

      结构体指针变量->成员名

如以下程序:

struct code

{

int n;char c;

}a,*p;

p=&a;

p是指向a的结构体指针,对于变量a中的成员又三种引用方式:

(1)a.n、a.c

(2)(*p).n、(*p).c:注意括号不可以少!

(3)p->n、p->c:等价为第二种形式,   ->优先级为1级

注意,p->n++等价于(p->n)++,是先取成员n的值,再使n加一

++p->n等价于++(p->n),是先对n加一,再取n的值。

结构体数组的指针

结构体变量作函数的参数

#include<stdio.h>
struct s
{
	int chinese;
	int maths;
};
int print(struct s y)
{
	printf("Chinese=%d\tmaths=%d", y.chinese, y.maths);
}
int main()
{
	struct s x;
	scanf_s("%d%d", &x.chinese, &x.maths);
	print(x);
	return 0;
}

结构体数组作函数参数:

#include<stdio.h>
struct stu
{
	int num;
	int score[3];
};
int count(struct stu s[], int n)//结构体数组作形参
{
	int i, j, c = 0, flag;
	printf("number is:\n");
	for (i = 0; i < n; i++)
	{
		flag = 0;
		for(j=0;j<3;j++)
			if (s[i].score[j] < 60)
			{
				flag = 1;
				break;
			}
		if (flag == 1)
		{
			c++;
			printf("%d\n", s[i].num);
		}
	}
	return c;
}
int main()
{
	int c;
	struct stu a[5] = { {1001,67,56,78},{1002,78,78,90},{1003,67,85,45},{1004,89,67,89},{1005,83,92,99} };
	c = count(a, 5);
	printf("nopass is:%d\n", c);
	return 0;
}

3、指向结构体的指针作函数参数、

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

万应低代码11月重点更新内容速递

速览版 详情版 低代码开发效率升级 1.页面变量支持快速构建 在「数据提交」、「调用逻辑」等存在数据返回的节点中&#xff0c;支持根据其输出的内容去自动创建数据类型相同的变量&#xff0c;并自动建立好映射关系。 ● 【功能上线前】&#xff1a; 需要为每一个输出字…

Elasticsearch_第一章_ elasticsearch基础

Elasticsearch_第一章_ elasticsearch基础 – elasticsearch基础 文章目录Elasticsearch_第一章_ elasticsearch基础0.学习目标1.初识elasticsearch1.1.了解ES1.1.1.elasticsearch的作用1.1.2.ELK技术栈1.1.3.elasticsearch和lucene1.1.4.为什么不是其他搜索技术&#xff1f;1…

企业该如何选择自己合适的云财务软件?

据相关数据统计&#xff0c;2021年&#xff0c;我国云服务市场规模达274亿美元&#xff08;超1700亿元人民币&#xff09;&#xff0c;预计到2026年将增长至850亿美元&#xff08;约5400亿元人民币&#xff09;。可见&#xff0c;云服务市场的发展之迅。对于企业而言&#xff0…

python入门项目03:完成黑心资本家发工资的程序

本题来源于黑马程序员b站视频&#xff0c;如有侵权&#xff0c;请联系删除。 import random #总金额10000 all_money10000 n0#记录发放工资的人 #发工资 for i in range(1,21):#20个员工jixiaorandom.randint(1,10)#生成一个1&#xff0c;10的随机数if jixiao<5:print(f员工…

12.1排序

目录 0.修改栈堆内存 一.堆排序 1 原理 2.代码实现 3.分析 二.冒泡排序 1 原理 2.实现 3.分析 三.快速排序(重要) 1 原理-总览 2.方法:挖坑法 步骤一 步骤二 步骤三 步骤四 步骤五 步骤六 3.代码实现挖坑法 4.分析 四.字符串转整数 1.字符串方法 2.字符…

【C++重点语法下】可变参数模板,STL里面的push_back和emplace_back区别 ,包装器function,bind

目录 1.可变参数模板 1.1取出参数包内的参数方法一&#xff1a; 1.2取出参数包内的参数方法二&#xff1a; 1.3STL里面的push_back和emplace_back区别 2.包装器function 2.1function&#xff08;头文件functional&#xff09; 2.1.1可调用类型和包装器 2.1.2类的成员函数…

实验十 符号计算基础与符号微积分(matlab)

目录 实验十 符号计算基础与符号微积分 1.1实验目的 1.3流程图 1.4程序清单 1.5运行结果及分析 1.6实验的收获与体会 1.1实验目的 1.2实验内容 符号计算基础与符号微积分 课本第372页 1.3流程图 1.4程序清单 实验十 1 clear xsym(6); ysym(5); z(1x)/(sqrt(…

第9章 登录页面的跳转实现

1 “swg-login.html”登录按钮不能触发异常 由于.Net框架默认支持“HTTPS”协议从而导致“swg-login.html”登录按钮不能触发&#xff0c;其异常信息如下&#xff1a;“Mixed Content: The page at https://localhost:7037/swg-login.html was loaded over HTTPS, but requeste…

FinalShell软件连接成功后,root文件夹显示一直加载中....

出现这样的问题就是因为我们一开始进入的用户是普通用户&#xff0c;然后你就会想着使用su命令转为超级用户&#xff0c;但是这样式不可行的&#xff0c;因为虚拟机会默认你第一次进入的用户是当前用户&#xff0c;还是解决不了问题。 解决办法&#xff1a; 再开一个连接进入…

java基于springboot_vue的校园闲置物品交易系统-计算机毕业设计

开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven 本文从管理员、用户的功能要求…

Java(八)----多线程(二)

1. 生产者与消费者 1.1 安全问题产生 线程本身就是一个新创建的方法栈内存 (CPU进来读取数据) 线程的notify(),唤醒第一个等待的线程 解决办法 : 全部唤醒 notifyAll() 被唤醒线程,已经进行过if判断,一旦醒来继续执行 线程被唤醒后,不能立刻就执行,再次判断标志位,利用循环 …

[附源码]Python计算机毕业设计Django基于Vue的社区拼购商城

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Python学习日记-第三十八天-生成器

系列文章目录 生成器创建生成器的方法生成器-使用send方式唤醒使用yield完成多任务一、生成器 利用迭代器&#xff0c;我们可以在每次迭代获取数据&#xff08;通过next方法&#xff09;时按照特定的规律进行生成&#xff0c;但是我们在实现一个迭代器时&#xff0c;关于当前…

Pr:导出设置之基本视频设置

视频 VIDEO设置因所选导出格式而异。每种格式都有独特的要求&#xff0c;这些要求决定了哪些设置可用。以导出文件格式为 H.264 为例&#xff0c;下面给出有关基本视频设置 Basic Video Settings的选项及说明。匹配源Match Souce自动设定视频设置选项以匹配源视频的属性。支持匹…

项目一共30个模块,你叫我maven版本一个个手动改?

之前有个群友私聊问我&#xff0c;如何快速统一去更改项目中所有的maven版本号&#xff0c;他说之前都是手动一个个去修改&#xff0c;项目一共有30多个maven模块&#xff0c;上次因为漏改了一个&#xff0c;还造成了生产事故。 其实我自己开源项目有的工程也非常多&#xff0…

Java入门必备知识你能掌握多少?

1、Java是一种高级计算机语言&#xff0c;是可以编写跨平台应用软件、完全面向对象的程序设计语言。 2、Java划分为三个技术平台&#xff1a;Java SE、Java EE、Java ME Java SE是桌面应用&#xff0c;Java EE是web应用&#xff0c;平台企业版&#xff0c;Java ME是手机应用&…

亚马逊鲲鹏系统批量注册功能可以让你快速拥有大量亚马逊买家号

亚马逊鲲鹏系统是一款能批量注册买家号、AI智能一键养号、模拟真人行为轨迹进行刷单测评的软件&#xff0c;而对于批量注册买家号&#xff0c;操作也是比较简单的。 主要流程是购买了相应的账号所需资料后&#xff0c;通过批量导入邮箱、邮箱密码、信用卡、收货地址进入软件然后…

嵌入式分享合集114

一、DMA DMA&#xff0c;全称Direct Memory Access&#xff0c;即直接存储器访问。 DMA传输将数据从一个地址空间复制到另一个地址空间&#xff0c;提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。 我们知道CPU有转移数据、计算、控制程序转移等很多功能&…

拿到8000元的火焰杯比赛奖金,感谢霍格沃兹测试开发学社

下面是我们获奖学员自己主动分享的 然后发给霍格沃兹测试开发学社表示感谢的&#xff0c;收到她的反馈我们也由衷的开心。所以也分享给大家&#xff0c;目前无论是应届生 在校生还是从业人员&#xff0c;都可以加入第三届火焰杯比赛&#xff0c;赢取属于专属于自己的荣耀。 我…

学生HTML个人网页作业作品:基于HTML实现教育培训机构网站模板毕业源码(8页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…