结构体指针的引入

概念引入

结构体指针类似于前面学习过的指针,我们先回忆下指针:指针就是地址,指针变量就是存放地址的变量。而结构体也是变量,变量访问有两种方式:1.变量名, 2.地址,之前案例,是用变量名访问。通过结构体变量地址来访问该结构体需要一个变量来保持这个地址:这和之前说的指针,其实是一样的,只是指针类型是结构体

定义方式

两者的定义方式基本一直,普通变量通过指针访问地址数据,而结构体变量通过结构体指针访问。

普通指针的定义

int a,
int *p;
p = &a;

结构体指针的定义

struct Test t;
struct Test *p;
p= &t

访问方式

结构体指针访问变量方法有:

1)p->结构体成员;
2)(*p).结构体成员;

#include <stdio.h>

struct Test
{
	int Data1;
	char Data2;
};

int main()
{
	struct Test data = {10,'a'};//1.类型 2.名 3.值
	struct Test *p = &data;//4.地址
	
	printf("通过data结构体访问得到的Data1是%d\n",data.Data1);
	printf("通过指针*p结构体访问得到的Data1是%d\n",p->Data1);
	printf("通过指针*p结构体访问得到的Data1是%d\n",(*p).Data1);
	
	printf("通过data结构体访问得到的Data2是%c\n",data.Data2);
	printf("通过指针*p结构体访问得到的Data2是%c\n",p->Data2);
	printf("通过指针*p结构体访问得到的Data2是%c\n",(*p).Data2);
	
	p->Data2 = 'm';//对指向数据进行修改
	printf("通过data结构体访问得到的Data2是%c\n",data.Data2);
	printf("通过指针*p结构体访问得到的Data2是%c\n",p->Data2);
	printf("通过指针*p结构体访问得到的Data2是%c\n",(*p).Data2);
	
	return 0;
}

实际应用

我们用结构体指针对前面的选票系统加以改良

#include <stdio.h>
#include <string.h>

struct XuanMin
{
	char name[64];
	int tickets;
};

int main()
{
	struct XuanMin a[3];//三位选手
	struct XuanMin max;//比较三位选手得票最大值
	struct XuanMin *p = a;//指向首地址数据
	
	int number = 5;//5个人参与投票
	char tempname[64];//投票的名字
	int feipiao = 0;//没选中的票
	
	int i;
	int j;
	int c = 0;//一个判断逻辑
	
	int len = sizeof(a)/sizeof(a[0]);
	
	p = a;//指向首地址
	for(i = 0;i < len;i++)
	{
		p->tickets = 0;
		printf("请输入第%d个选民的名字:\n",i+1);
		scanf("%s",p->name);
		p++;
	}
	p = a;//指向首地址
	for(i = 0;i < 5;i++)
	{
		c = 0;//每次循环让其等于0
		printf("请输入你要投给谁\n");
		memset(tempname,'\0',sizeof(tempname));//每次清空一下
		scanf("%s",tempname);//输入选中的选民
		p = a;//指向首地址
		for(j = 0;j < len;j++)
		{
			if(strcmp(tempname,p->name)==0)//选民与选手匹配,票数递增
			{
				p->tickets++;
				c = 1;//如果匹配后票数增加并等于1
			}
			p++;
		}
		if(c == 0)//还是为0说明没有匹配选手,则为没选中的票
		{
			printf("没有此选手,投票失败\n");
			feipiao++;
		}
	}
	p = a;//指向首地址
	for(i = 0;i < len;i++)
	{
		printf("名字:%s,票数:%d\n",p->name,p->tickets);
		p++;z
	}
	p = a;//指向首地址
	max=a[0];//让最大值先等于第一个人
	for(i = 1;i < len ;i++)//i=1是因为max已经等于数组中第一个人,只需要与后面两个进行比较
	{
		if(max.tickets < p->tickets)
		{
			max = a[i];//将三个人票数最多的赋给最大值
		}
		p++;
	}
	
	printf("%s以%d票当选!!!废票是%d\n",max.name,max.tickets,feipiao);
	return 0;
}

注意:1.每次进行新的循环要让指针重新指向首地址

           2.其中包含数组,经过一次循环后要偏移到数组中的下一位

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

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

相关文章

大厂面试题-什么是JVM

JVM全称是Java虚拟机&#xff0c;在聊什么是JVM之前&#xff0c;我们不妨看⼀下这张图。 从这张图中可以看出JVM所处的位置&#xff0c;同时也能看出它两个作用&#xff1a; 1、运⾏并管理Java源码⽂件所⽣成的Class⽂件&#xff0c; 2、在不同的操作系统上安装不同的JVM&#…

PostGreSQL模式schema

问题引入 之前在做数据库设计时&#xff0c;经常会忽略schema模式&#xff0c;直接在数据库下的public模式下建立各类数据表。如果数据表命名不够规范&#xff0c;后期寻找某张表时就会比较麻烦。通过 所幸&#xff0c;PostgreSQL 的模式schema管理&#xff0c;可以对这个问题…

正点原子嵌入式linux驱动开发——Linux INPUT子系统

按键、鼠标、键盘、触摸屏等都属于输入(input)设备&#xff0c;Linux内核为此专门做了一个叫做input子系统的框架来处理输入事件。输入设备本质上还是字符设备&#xff0c;只是在此基础上套上了input框架&#xff0c;用户只需要负责上报输入事件&#xff0c;比如按键值、坐标等…

C++——类和对象(上)

1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 例如手洗衣服 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间…

计算机视觉的相机选型

#你一般什么时候会用到GPT?# 目前市面上的工业相机大多是基于CCD&#xff08;ChargeCoupled Device&#xff09;或CMOS&#xff08;Complementary Metal Oxide Semiconductor&#xff09;芯片的相机。一般CCD制造工艺更加复杂&#xff0c;也会更贵一点&#xff01; 1、CCD工…

底层全部重构,小米澎湃OS完整系统架构公布

上周&#xff0c;雷军发文称小米全新操作系统澎湃 OS 正式版已完成封包&#xff0c;将逐步接替 MIUI。而后&#xff0c;又有网友曝光小米澎湃 OS 界面。 今日&#xff0c;雷军再度发表长文预热小米澎湃 OS&#xff0c;正式公布了完整系统架构。 据介绍&#xff0c;从架构设计之…

统计学习方法 决策树

文章目录 统计学习方法 决策树决策树模型与学习特征选择决策树的生成ID3 算法C4.5 的生成算法 决策树的剪枝CART 算法CART 回归树的生成CART 分类树的生成CART 剪枝 统计学习方法 决策树 阅读李航的《统计学习方法》时&#xff0c;关于决策树的笔记。 决策树模型与学习 决策…

归结原理、归结演绎推理

主要内容 归结演绎推理范式子句与子句集将谓词公式转化为子句集命题逻辑鲁宾逊归结原理 归结演绎推理 定理证明的实质是对前提P和结论Q证明P →Q的永真性应用反证法&#xff0c;欲证明P →Q&#xff0c;只要证明 P∧~Q 等价于 F鲁宾逊归结原理对机械化推理有重大突破鲁宾逊归…

【Ansible自动化运维工具 1】Ansible常用模块详解(附各模块应用实例和Ansible环境安装部署)

Ansible常用模块 一、Ansible1.1 简介1.2 工作原理1.3 Ansible的特性1.3.1 特性一&#xff1a;Agentless&#xff0c;即无Agent的存在1.3.2 特性二&#xff1a;幂等性 1.4 Ansible的基本组件 二、Ansible环境安装部署2.1 安装ansible2.2 查看基本信息2.3 配置远程主机清单 三、…

windows PC virtualBox 配置

效果&#xff1a; oracle vitualbox 可以访问通PC主机&#xff0c;可以访问外网: 注意&#xff0c;如果docker0网络地址&#xff0c;和PC主机的网络地址冲突了&#xff0c;需要变更docker的网络地址&#xff1a; root/home/mysqlPcap/anti-tamper $ cat /etc/docker/daemon.js…

C语言找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小,也可能没有鞍点

完整代码&#xff1a; /*找出一个二维数组中的鞍点&#xff0c;即该位置上的元素在该行上最大&#xff0c;在该列上最小&#xff0c;也可能 没有鞍点*/ #include<stdio.h> #include<stdlib.h> int main(){int n0;printf("请输入矩阵的行数:");scanf(&qu…

牛客网刷题-(7)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

168. Excel表列名称

168. Excel表列名称 Java代码&#xff1a; 26进制&#xff0c;但是每个进制是从1开始的&#xff0c;不是从0开始&#xff1b;因此要计算要构建从0开始的求余&#xff01; class Solution {public String convertToTitle(int cn) {StringBuilder sb new StringBuilder();whi…

matlab中类的分别之handle类和value类——matlab无法修改类属性值的可能原因

写在之前&#xff08;吐槽&#xff09; 最近由于变化了一些工作方向&#xff0c;开始需要使用matlab进行开发&#xff0c;哎哟喂&#xff0c;matlab使用的我想吐&#xff0c;那个matlab编辑器又没代码提示&#xff0c;又没彩色&#xff0c;我只好用vscode进行代码编辑&#xf…

计算机网络【CN】介质访问控制

信道划分介质访问控制 FDMTDMWDMCDM【掌握eg即可】 随机介质访问控制 CSMA 1-坚持CSMA 非坚持CSMA p-坚持CSMA 空闲时 立即发送数据 立即发送数据 以概率P发送数据&#xff0c;以概率1-p推迟到下一个时隙 忙碌时 继续坚持侦听 放弃侦听&#xff0c;等待一个随机的时…

Centos使用war文件部署jenkins

部署jenkins所需要的jdk环境如下&#xff1a; 这里下载官网最新的版本&#xff1a; 选择jenkins2.414.3版本&#xff0c;所以jdk环境最低得是java11 安装java11环境 这里直接安装open-jdk yum -y install java-11-openjdk.x86_64 java-11-openjdk-devel.x86_64下载jenkins最新…

12种常见的恶意软件类型与防范建议

1、病毒 病毒是迄今为止最常见的恶意软件类型之一。它是一种能够感染、破坏计算机设备&#xff0c;并在其运行系统上自我复制的程序。由于病毒是自我复制的&#xff0c;一旦安装并运行&#xff0c;它们就可以在同一网络上自动从一台设备传播到另一台设备&#xff0c;无需人为干…

ARM汇编指令之数据操作指令

数据搬移指令&#xff1a;立即数&#xff1a;在待判断的32位数&#xff08;以十六进制展开&#xff09;中&#xff0c;寻找一个0~255&#xff08;即0x00~0xff&#xff09;之间的数值&#xff0c;然后将这个数值循环右移偶数个位置&#xff0c;可以得到待判断的数&#xff0c;即…

【期中复习】深度学习

文章目录 机器&#xff08;深度&#xff09;学习的四大核心要素为什么深度学习&#xff0c;不增加网络宽度黑盒模型的问题计算图线性神经网络梯度下降学习率优化方法softmax函数用于多分类交叉熵线性回归与softmax回归的对比为什么需要非线性激活函数感知机线性回归、softmax回…

2023版 STM32实战12 IIC总线读写AT24C02

IIC简述 一个多主从的串行总线&#xff0c;又叫I2C&#xff0c;是由飞利浦公司发明的通讯总线 IIC特点 -1- 串行(逐bit传输) -2- 同步(共用时钟线) -3- 半双工(收发不同进行) -4- 总线上的任何设备都可以是主机 开发使用习惯和理解 -1- 通过地址寻址 -2- 数据线的…