C++死磕基础之指针篇(四)--结构体指针的定义以及使用

article/2025/8/21 19:15:06

本篇文章主要讲解C++指针中的另一种使用方法—结构体指针的使用

一.C++结构体的定义及创建方式

1.结构体定义
结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构,比如学生结构体,整合了学号,姓名等等信息。结构体的好处就是可以对这些信息进行整体管理操作,类似面向对象中类的属性,有了结构体,我就可以更好抽象描述一个类别。结构体声明的关键字为struct。

结构体和类很相似,类可以理解为从结构体衍生而来。

2.结构体的创建方式
第一种方式:
struct 结构体名称{
   数据类型 数据成员1;
   数据类型 数据成员2;
};

示例:

struct Person //声明一个结构体类型Person 
{char Name[20];声明一个字符型数组Namechar Sex;//声明字符型变量Sexchar Sex1;int Age;
};
int main(){struct Person P1;P1.Age=24;P1.Sex='m';//char类型只有一个字符//P1.Name="Will";//错误,Name已经指向了堆栈中的20个字符空间,无法指向常量strcpy(P1.Name,"Will");P1.Sex1='n';cout<<"int型赋值:"<<P1.Age<<endl;cout<<"char类型赋值:"<<P1.Sex<<endl;cout<<"两个字符相加:"<<P1.Sex+P1.Sex1<<endl;//字符相加为ASCII码的int数值相加cout<<"字符数组赋值:"<<P1.Name<<endl;return 0;
}

结果:
在这里插入图片描述
以上演示的是第一种结构体创建方式(PS:顺便讲解了一下数据类型的运算)。
注意:结构体类型是struct Person ,因此,struct和Person 都不能省略。

第二种方式:
typedef struct 结构体名称{
   数据类型 数据成员1;
   数据类型 数据成员2;
}结构体名称别名;

示例:

typedef struct Person
{char Name[20];char Sex;char Sex1;int Age;
}Per;int main(){struct Person P1;//方式一Per per;//方式二per.Age=18;per.Sex='w';P1.Age=24;P1.Sex='m';//char类型只有一个字符//P1.Name="Will";//错误,Name已经指向了堆栈中的20个字符空间,无法指向常量strcpy(P1.Name,"Will");P1.Sex1='n';cout<<"int型赋值:"<<P1.Age<<endl;cout<<"char类型赋值:"<<P1.Sex<<endl;cout<<"两个字符相加:"<<P1.Sex+P1.Sex1<<endl;//字符相加为ASCII码的int数值相加cout<<"字符数组赋值:"<<P1.Name<<endl;cout<<"per age:"<<per.Age<<endl;cout<<"per sex:"<<per.Sex<<endl;return 0;
}

结果:
在这里插入图片描述
第二种结构体创建方式使用了关键字typedef ,此关键字的作用就是声明数据类型的别名,这里用了之后,结构体名称别名就相当于struct 结构体名称Per。在声明结构体变量时,就无需写struct了(也可以使用struct 结构体名称 结构体变量名)。

第三种方式:
struct 结构体名称{
   数据类型 数据成员1;
   数据类型 数据成员2;
}结构体变量名;

示例:

struct Person
{char Name[20];char Sex;char Sex1;int Age;
}Per;int main(){Per.Age=24;Per.Sex='m';//char类型只有一个字符//P1.Name="Will";//错误,Name已经指向了堆栈中的20个字符空间,无法指向常量strcpy(Per.Name,"Will");Per.Sex1='n';cout<<"int型赋值:"<<Per.Age<<endl;cout<<"char类型赋值:"<<Per.Sex<<endl;cout<<"两个字符相加:"<<Per.Sex+Per.Sex1<<endl;//字符相加为ASCII码的int数值相加cout<<"字符数组赋值:"<<Per.Name<<endl;return 0;
}

结果:
在这里插入图片描述
第三种结构体创建方式既定义了结构体名称,同时声明了一个结构体变量名。在其它地方也可以通过struct 结构体来再次声明其它变量(比如在main函数中,可以使用struct Person Per1;声明第二个结构体变量名,因此,就有两个结构体变量名了)。

第四种方式:
struct {
   数据类型 数据成员1;
   数据类型 数据成员2;
}结构体变量名;

示例:

struct 
{char Name[20];char Sex;char Sex1;int Age;
}Per;
int main(){Per.Age=24;Per.Sex='m';//char类型只有一个字符//P1.Name="Will";//错误,Name已经指向了堆栈中的20个字符空间,无法指向常量strcpy(Per.Name,"Will");Per.Sex1='n';cout<<"int型赋值:"<<Per.Age<<endl;cout<<"char类型赋值:"<<Per.Sex<<endl;cout<<"两个字符相加:"<<Per.Sex+Per.Sex1<<endl;//字符相加为ASCII码的int数值相加cout<<"字符数组赋值:"<<Per.Name<<endl;return 0;
}

结果:
在这里插入图片描述
第四种结构体创建方式创建的是匿名结构体,在定义时声明结构体变量,但不能在其它地方声明,因为我们无法得知该结构体的标识符,所以就无法通过标识符来声明变量(没有结构体名称,就无法像第一种方式在main函数中使用struct Person P1方式声明结构体变量)。

补充,同时声明多个结构体变量名可以通过struct 结构体名称 结构体变量名方式声明,也可以直接在定义结构体时声明多个。比如
struct
{
char Name[20];
char Sex;
char Sex1;
int Age;
}Per1,Per2;
结构体变量名中间使用","隔开。

二.结构体指针

结构体指针就是指向结构体内存地址的指针。
结构体指针的定义方式为 结构体名称* 指针变量=&结构体变量。

第一种创建结构体方式的结构体指针

struct Person //声明一个结构体类型Person 
{int Age;
};
int main(){struct Person P1;Person* p=&P1;p->Age=20;cout<<p->Age<<endl;return 0;
}

结果:
在这里插入图片描述
第二种创建结构体方式的结构体指针

typedef struct Person
{int Age;
}Per;
int main(){//Person* p=&Per;错误,不允许使用Per类型名struct Person P1;Person* p=&P1;p->Age=15;cout<<p->Age<<endl;return 0;
}

结果:
在这里插入图片描述
第三种创建结构体方式的结构体指针

struct Person
{int Age;
}Per;
int main(){Person* p=&Per;p->Age=18;cout<<p->Age<<endl;return 0;
}

结果:
在这里插入图片描述
第四种创建结构体方式的结构体指针
由于没有结构体类型,所以无法创建结构体指针。

三.其它补充

结构体里也可以声明函数以及定义指针变量。

class TeacherA{
public:int a;
};
struct Person
{	TeacherA* t;int getAge();int Age;~Person();
}Per;
int Person::getAge()
{	t=new TeacherA;t->a=30;return t->a;
}
Person::~Person(){delete t;
}
int main(){Per.Age=18;cout<<Per.Age<<endl;cout<<Per.getAge()<<endl;return 0;
}

结果:
在这里插入图片描述

结构体的创建方式以及结构体指针的定义和使用就讲解到这里,希望大家通过阅读此篇文章可以更好地理解C++结构体相关的知识。


http://chatgpt.dhexx.cn/article/4OpikvPx.shtml

相关文章

指针与结构体

目录 1 啥是指针 1.1指针与指针变量 1.2总结 2 指针和指针类型 2 .1指针-整数 3 野指针 3.1 野指针的成因 3.2 如何避免野指针的出现 4 二级指针 5 指针数组 6 结构体 6.1 结构的声明 6.2 结构体变量的定义和初始化 6.3 结构体的访问 6.4 结构体传参 前言 最近又重新…

验证JDK是否安装成功

1.打开命令提示符(打开方式如下) ①方式一&#xff1a;快捷键winR&#xff0c;输入cmd命令&#xff0c;点击确定即可打开 ②方式二&#xff1a;直接在开始导航栏里面搜索cmd 最终进入如下页面&#xff1a; 2.输入命令javac,若出现如下的提示表示JDK安装成功&#xff1b;如果提示…

ubuntu下pytorch验证安装成功程序

根据pytorch官网提供的程序 from __future__ import print_function import torch x torch.rand(5, 3) print(x)新建.py文件把以上代码复制进去 输入指令 python3 "文件名"可得到如下输出 另外也可以通过命令行验证pytorch是否安装成功&#xff0c;输入后不报错…

MongoDB权限验证开启与mongoose数据库配置

Express项目最常用的数据库是mongodb&#xff0c;并搭配模块mongoose完成对数据库的访问。 本文假设您已经正确的完成了mongodb数据库的安装&#xff0c;下面是针对mongodb的设置和项目配置工作。 一、为mongodb数据库设置权限验证 在mongodb安装完成之后&#xff0c;默认情况…

oracle安装成功验证

验证安装成功 打开sql命令黑窗口 输入命令 conn system 输入密码&#xff0c;密码是看不见的。 就连接好了。 接着要安装数据库管理系统&#xff08;一个&#xff09; 数据库&#xff08;多个&#xff09; SID&#xff1a; 数据库的唯一标识符&#xff0c;就是指数据库名 or…

python 密码验证

题目描述&#xff1a; (1)模拟登陆界面&#xff0c;判别用户名和密码&#xff0c;给出合适的提示&#xff0c;如果超过三次&#xff0c;锁定输入。用代替密码&#xff1b;或者最新输入显示&#xff0c;前面的变成&#xff1b;安全性措施。 (2)同时添加如下图的加强验证&#x…

MMDetection的安装及验证

参考&#xff1a;安装 — MMDetection 2.22.0 文档 进入openMMLab社区好久了&#xff0c;但是前面都是在学一些基础知识&#xff0c;最近看到了目标检测的部分&#xff0c;然后尝试配置了一下mmDet的环境&#xff0c;过程中踩了很多坑&#xff0c;也用了很长时间&#xff0c;在…

java环境变量配置验证_怎么验证Java环境变量配置成功

Java环境变量已经配置完了,不知道行不行,那么怎么验证Java环境变量配置成功呢?下面是学习啦小编收集整理的怎么验证Java环境变量配置成功&#xff0c;希望对大家有帮助~~ 验证Java环境变量配置成功的方法 方法/步骤 首先&#xff0c;在桌面右击&#xff0c;选择“文本文档”&a…

验证tomcat安装成功

安装之后: 1.到安装目录下找startup.bat不闪退,并出现以下图2为成功安装: 再打开谷歌浏览器输入: localhost:8080验证. Tomcat服务器介绍和使用: 服务器的概念和作用: 问题: 学习了java编程之后,java代码的一个很重要的作用就是进行数据的处理,但是目前来说我们运行编写的…

京东手势验证

先给大家看看京东的验证码有多变态 长这个样子&#xff0c;作者测试过程中在浏览器最多划了二十几次才通过&#xff0c;搞到我都开始怀疑根本就过不去。jd验证码花了我一周多时间才搞完&#xff0c;一直卡在这个轨迹上面&#xff0c;想用深度学习又不知道弄出来轨迹该怎么生成&…

[ant design vue] 表单验证成功,提示信息不显示

以上是原图以及源代码&#xff0c;input中带有表单验证&#xff0c;但是输入0以后却不显示报错信息&#xff0c;后来通过大哥指点&#xff0c;因为一个a-form-item只验证一个input,所以给每一个input加一个a-form-item问题解决。代码及效果如下&#xff1a;

怎么验证mysql安装成功_mysql如何验证是否安装成功

mysql验证是否安装成功的方法&#xff1a;1、打开DOS窗口&#xff0c;输入status命令查看MySQL版本信息&#xff1b;2、打开MySQL 5.7 Command Line Client程序&#xff0c;打开当前MySQL服务器状态&#xff0c;输入相关命令能显示当前的数据库列表即可。 相关学习推荐&#xf…

局域网内构建自己的ntp校时服务器并验证成功与否

局域网内构建自己的ntp校时服务器并验证成功与否 最近委座提了个要求&#xff0c;模拟客户那边的环境&#xff0c;局域内网搭建个ntp校时服务器&#xff0c;然后让其他服务器跟这个ntp服务器保持一致的时间。 开始干吧&#xff0c;分2步走&#xff1a;1.先找两台centos7.x的服…

Vue Element表单验证成功后,清空表单

this.$refs.ruleForm.resetFields() 这是用来清空表单的代码&#xff0c;实际使用可以放在显示操作成功的代码下面&#xff0c;在接口调用成功后执行。 出处是&#xff1a;

JWT的介绍与应用

目录 2.JWT的应用场景 3.JWT的应用详解 4.为什么要用JWT 2.1 传统Session认证的弊端 2.2 JWT认证的优势 5.JWT结构 1.Header 2.Payload 3.Signature 6.JWT的种类 JSON Web Token&#xff08;JWT&#xff09;是一个开放式标准&#xff08;RFC 7519&#xff09;&#xf…

判断MySQL安装是否成功的两种验证方法

如何判断MySQL是否安装成功&#xff1f; 一、命令提示符cmd窗口验证二、MySQL控制台验证 一、命令提示符cmd窗口验证 键盘winR打开命令提示符&#xff0c;输入cmd。 在电脑中找到安装好的MySQL的bin文件目录 。这是我的安装目录C:\Program Files\MySQL\MySQL Server 5.7\bin。…

Anaconda 安装及验证是否安装成功

关于安装&#xff1a; 1、打开准备好的安装包&#xff08;官网下载或者镜像网站下载都可以&#xff09;&#xff0c;点next 2、继续点I Agree 3、点All Users 4、安装位置&#xff0c;默认安装在C盘&#xff0c;点击更改&#xff0c;自定义路径&#xff0c;要确保这个路径下是…

如何将Excel数据转化成树状结构

数据如下图 请问怎么才能将以上数据转换成树状结构 因为数据较多&#xff0c;除去手动分组的方法请问还有什么方法呢&#xff1f;

Excel表格中建立树形结构

Excel表格中建立树形结构 2010-04-05 17:56:37| 分类&#xff1a; 开发笔记 |字号 订阅 有时在excel表格中需要建立树形结构&#xff0c;如下图所示。 对动物、植物进行分类。 动物、植物类中分别有子类&#xff0c;像动物中有鸟、猫、狗等。 每个子类又有自己的子类&#…