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

本文详细介绍了C++中结构体的四种定义方法,并通过示例代码展示了每种定义方式下结构体指针的使用。此外,还涉及了结构体内函数声明与指针变量定义等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

示例:

struct Person //声明一个结构体类型Person 
{
    char Name[20];声明一个字符型数组Name
    char Sex;//声明字符型变量Sex
	char 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++结构体相关的知识。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值