@结构体数组指向结构体变量的指针

例子例子

一、结构体数组的定义

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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值