c语⾔初始化指针指向结构体数组,详解C++中的指针结构体数
组以及指向结构体变量的指针...
C++结构体数组
⼀个结构体变量中可以存放⼀组数据(如⼀个学⽣的学号、姓名、成绩等数据)。如果有10个学⽣的数据需要参加运算,显然应该⽤数组,这就是结构体数组。结构体数组与以前介绍过的数值型数组的不同之处在于:每个数组元素都是⼀个结构体类型的数据,它们都分别包括各个成员项。
定义结构体数组和定义结构体变量的⽅法相仿,定义结构体数组时只需声明其为数组即可。如:
struct Student //声明结构体类型Student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
Student stu[3]; //定义Student类型的数组stu
也可以直接定义⼀个结构体数组,如:
struct Student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}stu[3];
struct
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}stu[3];
结构体数组的初始化与其他类型的数组⼀样,对结构体数组可以初始化。如:
struct Student
{
int num;
char name[20];定义数组初始化
char sex;
int age;
float score;
char addr[30];
}stu[3]={
{10101,″Li Lin″, ′M′, 18,87.5, ″103 Beijing Road″},
{10102,″Zhang Fun″,′M′,19,99, ″130 Shanghai Road″},
{10104,″Wang Min″,′F′, 20,78.5, ″1010 Zhongshan Road″}
};
定义数组stu时,也可以不指定元素个数,即写成以下形式:
stu[ ]={{…},{…},{…}};
编译时,系统会根据给出初值的结构体常量的个数来确定数组元素的个数。⼀个结构体常量应包括结构体中全部成员的值。
当然,数组的初始化也可以⽤以下形式:
Student stu[ ]={{…},{…},{…}}; //已事先声明了结构体类型Student
由上可以看到,结构体数组初始化的⼀般形式是在所定义的数组名的后⾯加上 ={初值表列};
结构体数组应⽤举例
下⾯举⼀个简单的例⼦来说明结构体数组的定义和引⽤。
【例】对候选⼈得票的统计程序。设有3个候选⼈,最终只能有1⼈当选为领导。今有10个⼈参加投票,从键盘先后输⼊这10个⼈所投的候选⼈的名字,要求最后输出这3个候选⼈的得票结果。
可以定义⼀个候选⼈结构体数组,包括3个元素,在每个元素中存放有关的数据。程序如下:
#include
using namespace std;
struct Person //声明结构体类型Person
{
char name[20];
int count;
};
int main( )
{
//定义Person类型的数组,内容为3个候选⼈的姓名和当前的得票数Person leader[3]={"Li",0,"Zhang",0,"Fun",0};
int i,j;
char leader_name[20]; //leader_name为投票⼈所选的⼈的姓名for(i=0;i<10;i++)
{
cin>>leader_name; //先后输⼊10张票上所写的姓名
for(j=0;j<3;j++) //将票上姓名与3个候选⼈的姓名⽐较
//如果与某⼀候选⼈的姓名相同,就给他加⼀票
if(strcmp(leader_name,leader[j].name)==0) leader[j].count++; }
cout<
for(i=0;i<3;i++) //输出3个候选⼈的姓名与最后得票数
{
cout<
}
return 0;
}
运⾏情况如下:
Zhang↙ (每次输⼊⼀个候选⼈的姓名)
Li↙
Fun↙
Li↙
Zhang↙
Li↙
Zhang↙
Li↙
Fun↙
Wang↙
Li:4 (输出3个候选⼈的姓名与最后得票数)
Zhang:3
Fun:2
程序定义⼀个全局的结构体数组leader,它有3个元素,每⼀元素包含两个成员,即name(姓名)和count(得票数)。在定义数组时使之初始化,使3位候选⼈的票数都先置零。
在这个例⼦中,也可以不⽤字符数组⽽⽤string⽅法的字符串变量来存放姓名数据,程序可修改如下:
#include
#include
using namespace std;
struct Person
{
string name;//成员name为字符串变量
int count;
};
int main( )
{
Person leader[3]={"Li",0,"Zhang",0,"Fun",0};
int i,j;
string leader_name;// leader_name为字符串变量
for(i=0;i<10;i++)
{
cin>>leader_name;
for(j=0;j<3;j++)
if(leader_name==leader[j].name) leader[j].count++//⽤“==”进⾏⽐较
}
cout<
for(i=0;i<3;i++)
{
cout<
}
return 0;
}
运⾏情况与前相同。显然后⼀个程序节省内存空间,使⽤更⽅便,易读性更好。但是 有些C++系统不能对包含string成员的结构体变量初始化,需要作⼀些修改才能运⾏, 读者可上机试⼀下。
C++指向结构体变量的指针
⼀个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设⼀个指针变量,⽤来指向⼀个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量也可以⽤来指向结构体数组中的元素。
通过指向结构体变量的指针引⽤结构体变量中的成员
下⾯通过⼀个简单例⼦来说明指向结构体变量的指针变量的应⽤。
【例】指向结构体变量的指针的应⽤。
#include
#include
using namespace std;
int main( )
{
struct Student//声明结构体类型student
{
int num;
string name;
char sex;
float score;
};
Student stu;//定义Student类型的变量stu
Student *p=&stu;//定义p为指向Student类型数据的指针变量并指向stu
stu.num=10301;//对stu中的成员赋值
stu.name="Wang Fun";//对string变量可以直接赋值
stu.sex='f';
stu.score=89.5;
cout<
stu.score<
cout<
num<
return 0;
}
程序运⾏结果如下:
10301 Wang Fun f 89.5 (通过结构体变量名引⽤成员)
10301 Wang Fun f 89.5 (通过指针引⽤结构体变量中的成员)
两个cout语句输出的结果是相同的。
为了使⽤⽅便和使之直观,C++提供了指向结构体变量的运算符->,例如p->num表⽰指针p当前指向的结构体变量中的成员num。p->num 和(*p).num等价。
同样