结构体数组(C语言结构体数组的定义)
你是否对于结构体数组和C语言结构体数组的定义感到困惑?别担心,今天小编将为您揭开这个谜团,让我们一同探索吧!
C语言结构体数组的定义
所谓结构体数组,是指数组中的每个元素都是一个结构体。在实际应用中,C语言结构体数组常被用来表示一个拥有相同数据结构的群体,比如一个班的学生、一个车间的职工等。
结构体可以存储不同的数据类型,将他们互相联系起来。结构体数组可以连续存储多个结构体,和数组作用相似。比如想定义同一个最小外接矩形的四个坐标值,并给予这个矩形一个特征编号。当需要存储多个最小外接矩形的信息时,就需要动态申请一个结构体数组。
struct结构体类型名{类型名成员名;类型名成员名;……},先声明结构体类型,再定义结构体变量名。声明结构体类型,不分配空间,定义结构体类型变量,就要分配内存空间。
扩展资料:
结构体数组指针类型:
一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址,指针变量也可以用来指向结构体数组中的元素。
1、类型一:
指向结构体变量的指针引用结构体变量中的成员。
2、类型二:
用结构体变量和指向结构体变量的指针构成链表,链表是一种常见的重要的数据结构。链表有一个“头指针”变量,以head表示,它存放一个地址。该地址指向一个元素。
链表中的每一个元素称为“结点”,每个结点都应包括两个部分:
一是用户需要用的实际数据,
二是下一个结点的地址。
链表中各元素在内存中的存储单元可以是不连续的。要找某一元素,可以先找到上一个元素,根据它提供的下一元素地址找到下一个元素。这种链表的数据结构,必须利用结构体变量和指针才能实现。
可以声明一个结构体类型,包含两种成员,一种是用户需要用的实际数据,另一种是用来存放下一结点地址的指针变量。
参考资料来源:百度百科—结构体类型—数组
结构体类型的数组
一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据)。如果有10个学生的数据需要参加运算,显然应该用数组,这就是结构体数组。结构体数组与以前介绍过的数值型数组的不同之处在于:
每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员项。定义结构体数组和定义结构体变量的方法相仿,定义结构体数组时只需声明其为数组即可。如
{ 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
由上可以看到,结构体数组初始化的一般形式是在所定义的数组名的后面加上={初值表列};下面举一个简单的例子来说明结构体数组的定义和引用。
例7.2对候选人得票的统计程序。设有3个候选人,最终只能有1人当选为领导。今有10个人参加投票,从键盘先后输入这10个人所投的候选人的名字,要求最后输出这3个候选人的得票结果。可以定义一个候选人结构体数组,包括3个元素,在每个元素中存放有关的数据。
程序如下:
#include<iostream>
struct Person//声明结构体类型Person
{
char name[20];
int count;
}Person leader[3]={″Li″,0,″Zhang″,0,″Fun″,0};
//定义Person类型的数组,内容为3个候选人的姓名和当前的得票数
int main()
{
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<<endl;
for(i=0;i<3;i++)//输出3个候选人的姓名与最后得票数
{cout<<leader[i].name<<″:″<<leader[i].count<<endl;}
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<iostream>
#include<string>
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<<endl;
for(i=0;i<3;i++)
{cout<<leader[i].name<<″:″<<leader[i].count<<endl;}
return 0;
}
C++怎么在结构体里定义动态数组
首先,第一种情况不会出现,所谓结构体可以理解为一种特殊的,默认内部public的,并且不写方法和函数的类,当然你写方法也可以编译的,所以他就是一个类,而如果是数组在结构体中,那么指挥定义一个指针,而不会定义成实例数组,用的时候外部new,所以第一种情况会写成类,然后在构造函数里面new,析构里面delete
第二,是可以的,你写错的原因应该是在for'里面,因为你的结构体都是系统的类型,不是指针,是可以直接new得到,也就是说,你在new Gcell的时候就已经完全搞定了,不需要for,如果是想要修改的话,应该是(*Cell[i]).ran.min=123;这样,而不是再new
结构体数组和C语言结构体数组的定义的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!