本篇文章主要讲解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++结构体相关的知识。