结构体基础全家桶(2)结构体指针

目录

指向结构体类型数据的指针:

指向结构体变量的指针:

创建:

应用:

注意事项:

指向结构体数组的指针

创建:

应用:

注意:

用结构体变量和指向结构体的指针做函数的参数

注意:

下期预告:结构体的内存对齐


雨过终有天晴,不是吗

在前面我们已经了解了普通变量指针,数组指针,函数指针。指针的合理运用可以让我们的程序运行更加高效,代码的数量得到有效的减少。这里我们来讲解结构体的指针:

如果对指针不是太了解,也可以看一下这篇关于指针的文章:

【小白都爱的指针入门理解 】http://t.csdnimg.cn/IOpzx

指向结构体类型数据的指针:

一个结构体变量的指针就是改变量所占据的内存短的起始地址。我们可以设置一个指针来指向结构体的其实位置地址,同时也可以用来指向结构中的元素。

指向结构体变量的指针:

创建:

与普通指针的创建方式一样,我们需要先声明指针的类型“struct student",接着表明这是一个指针
 
struct student {

	int age;
	char name[20];
	int num;

}student1;
int main()
{
	struct student* p1 = &student1;

	return 0;
}

应用:

我们可以通过指针来给结构体进行初始化,以及对结构体的成员值进行改变:
int main()
{
	struct student* p1 = &student1;
	(*p1).age = 100;
	(*p1).name[0] = 's';
	(*p1).num = 200;

	return 0;
}

注意事项:

  • 在对结构体成员中的数组赋值时我

    们要找到最低单位,也就是要找到数组中的单个元素,不能对数组整体赋值。
  • 因为运算优先级” .” 要大于” * “,这里的()不能省去。
  • 这里的(*p).可以用p->来代替,->为指向运算符

指向结构体数组的指针

先前我们已经介绍过,指针可以指向普通变量数组。同样指针也可以指向结构体数组,两者具有相似性。

创建:

方法与上述方法相同:
struct student {

	int age;
	char name[20];
	int num;

}arr[3] = {
	{10,"haha",100},
	{20,"lili",200},
	{30,"hehe",300}
};//定义结构体数组

int main()
{
	struct student* p = &arr;//创建


	return 0;
}

应用:

这里依旧要准寻找到最小单位的准则!
int main()
{
	struct student* p = &arr[0];//创建
	printf("%d\n", (*p).age);
	p++;
	printf("%d\n", (*p).age);

	return 0;
}

运行结果:

10
20

注意:

  • 这里&arr指向数组中第一个元素的地址。
  • 这里p++会跳过一个结构体指向下一个结构体,而不是指向原结构体下一个元素。
  • p已经被程序定义为指向struct student 类型数据的指针,它只能指向结构体类型,而不能指向结构体中的单个元素。

用结构体变量和指向结构体的指针做函数的参数

将一个结构体变量的值传参我们这里介绍两种:

1.结构体成员传参,将结构体的单个成员的值传入:

int add(int a)
{
	return 2 * a;
}
struct student {

	int age;
	char name[20];
	int num;
}student1={10,"asdf",300};
int main()
{
	int m = add(student1.age);

	return 0;
}

2.结构体地址传参:

void pff(int* p)
{
	*p = (*p) * 2;
}
int main()
{
	
	int* p = &(student1.age);
	pff(p);
	printf("%d\n",*p);
	return 0;
}

注意:

传值与传址两者的区别,传值并不会改变原本值的大小,而传址将会改变原本变量值的大小。

这里我们打印出来的值为20!

这篇文章到这里就结束了,如果感觉不够了解,可以回顾上期文章:

【结构体基础全家桶(1)创建与初始化 】http://t.csdnimg.cn/8n2kP

下期预告:结构体的内存对齐

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

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

相关文章

【Linux】文件系统、文件系统结构、虚拟文件系统

一、文件系统概述 1. 什么是文件系统?2. 文件系统(文件管理系统的方法)的种类有哪些?3. 什么是分区?4. 什么是文件系统目录结构?5. 什么虚拟文件系统Virtual File System ?6. 虚拟文件系统有什…

selenium 与 chromedriver安装

本文章向大家介绍selenium 安装与 chromedriver安装,主要包括selenium 安装与 chromedriver安装使用实例、应用技巧、基本知识点总结和需要注意事项供大家参考。 一、安装selenium 1、Selenium简介 Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开…

IDEA配置一个新项目

git clone xxxxx 下载项目主分支 git checkout xxx 切换到需要开发的分支上 配置maven仓库 在File下的Settings中设置maven仓库 配置maven仓库的文件夹 配置好maven后,项目中会出现一个红色的pom.xml文件,右击文件,点击…,pom…

RabbitMq基本使用

目录 SpringAMQP1.准备Demo工程2.快速入门1.1.消息发送1.2.消息接收1.3.测试 3.WorkQueues模型3.1.消息发送3.2.消息接收3.3.测试3.4.能者多劳3.5.总结 SpringAMQP 将来我们开发业务功能的时候,肯定不会在控制台收发消息,而是应该基于编程的方式。由于R…

ArrayList与LinkLIst

ArrayList 在Java中,ArrayList是java.util包中的一个类,它实现了List接口,是一个动态数组,可以根据需要自动增长或缩小。下面是ArrayList的一些基本特性以及其底层原理的简要讲解: ArrayList基本特性: 动…

科大讯飞(深圳)测开面试真题

一面(测试组长面) 1、上家公司项目以及团队的规模是怎么样的? 2、你负责的项目整体的流程是怎么样的? 3、自动化实施过程中,是如何和业务测试进行沟通的? 4、在上家公司你已经是专职做自动化了&#xf…

会声会影怎么使用? 会声会影2024快速掌握入门技巧

一听说视频剪辑我们就不由得联想到电影、电视等一些高端的视频剪辑技术,大家都觉得视频剪辑是一个非常复杂而且需要很昂贵的设备才可以完成的技术活,这对很多“门外汉”来说都可望而不可及。实际上,使用会声会影剪辑视频不仅是很多人都可以操…

《面向机器学习的数据标注规程》摘录

说明:本文使用的标准是2019年的团体标准,最新的国家标准已在2023年发布。 3 术语和定义 3.2 标签 label 标识数据的特征、类别和属性等。 3.4 数据标注员 data labeler 对待标注数据进行整理、纠错、标记和批注等操作的工作人员。 【批注】按照定义…

【话题】低代码123

目录 一、什么是低代码 二、低代码的优缺点 三、你认为低代码会替代传统编程吗? 四、有哪些低代码工具和框架 4.1 国外的平台 4.2 国内的平台 五、未来的软件研发 低代码,听着就过瘾的一个词。而且不是无代码,这说明,低代码…

GoogLeNet(pytorch)

亮点与创新: 1. 引入Inception基础结构 2. 引入PW维度变换卷积,启迪后续参数量的优化 3. 丢弃全连接层,使用平均池化层(大大减少模型参数) 4. 添加两个辅助分类器帮助训练(避免梯度消失,用于…

方舟无限ARX-5臂的奇异验证

事情起因是,某技术人员号称这款机械臂无奇异点,博主当场一个【黑人问号脸】。 既然是串联臂,大概很难做到无奇异点~ 为了反驳,博主建模简单分析了下,偏置参数随便写了个,具体验证程序见文末。 clear,clc,…

共同编辑文档功能实现(websocket)

目录 前言 websocket封装 wangeditor下载 共同编辑文档代码实现 HTML样式部分 JS部分 css部分 前言 功能:实现文档共同编辑功能,可以实时接收到其他人的信息 思路:先调用接口获取相应的数据进行渲染,然后通过webSocket建…

C#基础知识 - 基本语法篇

C#基础知识-基本语法篇 第2节 C#基本语法2.1 C#程序结构2.2 C# 结构解析2.3 命名空间及标识符、关键字2.3.1 别名的使用2.3.2 标识符2.3.3 C#关键字 更多C#基础知识详解请查看:C#基础知识 - 从入门到放弃 第2节 C#基本语法 2.1 C#程序结构 “Hello, World”程序历…

棋牌的电脑计时计费管理系统教程,棋牌灯控管理软件操作教程

一、前言 有的棋牌室在计时的时候,需要使用灯控管理,在开始计时的时候打开灯,在结账后关闭灯,也有的不需要用灯控,只用来计时。 下面以 佳易王棋牌计时计费管理系统软件为例说明: 软件试用版下载或技术支…

Java架构师系统架构高可用维度分析

目录 1 导语2 可用性介绍3 本地高可用-集群、分布式4 本地高可用-数据逻辑保护5 异地容灾-双活、两地三中心6 异地容灾-DRP规划&BCP业务连续性7 多活和妥协方案8 高可用流程9 总结想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导语 Java架构师在进行系统架构设…

ELk(七)—部署Nginx

目录 部署Nginxfilebeat启动Nginx模块Module对nginx模块配置进行修改修改nginx-log.yml配置文件 部署Nginx 下面是nginx的安装脚本,里面的参数可以根据实际需要进行修改。 #!/bin/bash#新建一个文件夹用来存放下载的nginx源码包mkdir -p /opt/nginx cd /opt/nginx…

Android Studio 软件如何将系统自带的标题栏隐藏

目录 一、实现效果 二、开发环境 三、实现方法 ①首先创建一个新的项目 ②打开你需要隐藏标题栏的Activity ③我们看下正常的显示效果 ④然后在onCreate中进行代码编写 ⑤点击运行查询看效果 三、Android Studio 模板 一、实现效果 二、开发环境 三、实现方法 在Andro…

千帆竞渡,鸿蒙已过万重山

近期,华为宣布其自主研发的鸿蒙Next系统将不再兼容Android系统,而是完全独立运营。 也就是说,你的 Android APK 已经不能在 HarmonyOS NEXT 上运行,因为系统已经不存在 AOSP 代码,甚至没有 JVM。 此举意味着鸿蒙系统…

pytorch网络的增删改

本文介绍对加载的网络的层进行增删改, 以alexnet网络为例进行介绍。 1. 加载网络 import torchvision.models as models alexnet models.alexnet(weightsmodels.AlexNet_Weights.DEFAULT) print(alexnet)2. 删除网络 在做迁移学习的时候,我们通常是在分类网络的…

为uniDBGrid设置文字操作栏

为uniDBGrid设置文字操作栏,如下图的效果,用户点击审核,执行审核代码,点退回,执行退回代码: 对于Web应用界面,这是最常见的方式,那对于我等Delphi开发者来说,基于uniGUI该…