一、结构体数组的定义
struct student
{ int
num;
char name[20];
char sex;
int age;
float score;
char addr[30];
} ;
[struct]
student stu[3];
struct student
{ 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;
} stu[3]={{1011, “Li Lin”,‘M’},
{1012,“Wang Lan”,‘F’},
{1013,“Liu Fang”,‘F’}};
struct student
{ int
num;
char
name[20];
char sex;
} stu[ ]={ {1011,“Li Lin”,‘M’},
{1012,“Wang Lan”,‘F’},
{1013,“Liu Fang”,‘F’}};
• 输入10个学生的姓名、学号和成绩,将其中不及格者的姓名、学号和成绩输出(P163.17)
Struct student
{
char
name[10];
int number;
int score;
}
void input(student *p_stu)
{
cout<<“Please
input the name ,number and score of a student:”<<endl;
for(int
i=0;i<10;i++)
{
cin>>p_stu[i].name;
cin>>p_stu[i].number;
cin>>p_stu[i].score;
}
}
void output(student *p_stu)
{
cout<<“Output
the name ,number and score of a student:”<<endl;
for(int
i=0;i<10;i++)
{
if(p_stu[i].score<60)
{
cout<<p_stu[i].name<<" ";
cout<<p_stu[i].number<<" ";
cout<<p_stu[i].score<<endl;
}
}
}
指向结构体变量的指针
一个结构体变量的指针就是该变量所占据的内存段的起始地址。
可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。
指针变量也可以用来指向结构体数组中的元素。
int main( ){
struct
Student
{ int num;
char name[10];char sex; float
score;};
Student stu, *p=&stu;
stu.num=10301; strcpy(stu.name,″Wang Fu″);
stu.sex=‘f’; stu.score=89.5;
cout<<stu.
num<<″ ″<<stu.name<<″ ″<<stu.sex<<″ ″<<stu.score<<endl;
cout<<(*p).num<<″
″<<(*p).name<<″ ″<<(*p).sex<<″
″<<(*p).score<<endl;
cout<num<<″
″<< p-> name<<″ ″<< p-> sex<<″ ″<< p->
score<<endl;
return 0;
}
• 指针与内存动态分配
通过使用new与delete单目运算符来实现动态变量的分配与撤消
1)动态申请内存操作符 new
使用格式:
new <类型名> //动态变量
new <类型名> ( <初值> )
new <类型名> [ <元素个数> ]
//动态数组
功能:
生成一个(或一批)所给类型的无名动态变量。
结果值:
成功:所生成变量类型的指针(首地址) ,指向新分配的内存。
失败:0(NULL)
• 指针与内存动态分配
例:
int *pi, *pj, a=10;
char *pc;
pi = new int;
*pi = a*a;
pc = new char('A');
pj = new int[10];
2)释放内存操作符delete
使用格式:
delete <指针>
delete [ ] <指针>
功能:
释放通过new生成的动态变量(或动态数组),但指针变量仍存在。
例:
int *pi, *pj;
pi = new int;
pj = new int[10];
...
delete pi;
//释放动态变量*pi, 但指针变量pi仍存在
delete []pj;
以变量形式分配内存比较死板。有了new和delete,就可以实现一种动态分配内存的形式,即通过指针引用,而内存的分配和释放可以在程序的任何地方进行。
int *pint;
char *pchar; float *pfloat;
pfloat = new
float; //生成1个浮点型变量
pchar = new
char; //生成1个字符型变量
pint = new
int; //生成1个整型变量
这些变量都没有名字。
三个变量的地址分别存在指针pfloat,pchar 和pint,在程序中使用这三个变量时,全通过指针:
*pchar = ‘A’;
*pint = 5;
*pfloat = 4.7;
• 当不再需要这些变量时,可在程序的任何地点释放掉它们:
delete pchar;
delete pint; delete pfloat;
这里释放的是动态的(char,int,float)变量,而不是指针变量(pchar, pint, pfloat)。
• 在使用动态变量时应注意的是,要保护动态变量的地址。
例如在执行
pi=new int; 之后,不要轻易地冲掉指针pi中的值,假如执行了pi=&a;语句之后,再释放原来生成的动态变量:
delete pi; 已经达不到原来的目标了。
这将造成内存的泄漏,如果过多的话,将占用大量系统内存资源,造成内存资源的浪费。
动态创建结构体变量举例
#include
#include
using namespace std;
struct Student
{ int num;
float score[3];
}stu={12345,67.5,89,78.5};
void print(Student *p)
{
cout<num<<"
";
cout<score[0]<<"
";
cout<score[1]<<"
";
cout<score[2]<<endl ;
}
int main( )
{
void
print(Student *);
int i;
Student
*pt=&stu;
print(pt);
pt=new Student;
cin>>pt->num;
for(i=0;i<3;i++)
cin>>pt->score[i];
print(pt);
delete pt;
return 0;
}
(1) 用结构体变量作函数参数
#include
#include
using namespace std;
struct Student //声明结构体类型Student
{ int num;char name[20]; float score[3]; };
void print(Student stu)
{
cout<<stu.num<<″
″<<stu.name<<″ ″;
cout<<stu.score[0]<<″
″
cout<<stu.score[1]<<″
″<<stu.score[2]<<endl;
}
int main( )
{
Student
stu; //定义结构体变量
stu.num=12345;
stu.name=″Li
Fung″;
stu.score[0]=67.5;
stu.score[1]=89;
stu.score[2]=78.5;
print(stu);
return 0;
}
(2) 用指向结构体变量的指针作实参
#include
#include
using namespace std;
struct Student
{ int num;string name; float score[3];
}stu={12345,″Li Fung″,67.5,89,78.5};
void print(Student *p)
{
cout<num<<″ ″<name<<″ ″;
cout<score[0]<<″ ″;
cout<score[1]<<″ ″<score[2]<<endl;
}
int main( )
{
void print(Student *);
Student
*pt=&stu;
print(pt);
return 0;
}