您的位置:首页 > 其它

指向结构体类型的指针数组做函数参数

2015-09-13 19:32 477 查看


结构体类型指针做函数参数(C++)

设有学生情况登记表如图所示,用选择排序法对该表按从小到大进行排序。

学生情况登记表
学号num姓名name[8]性别sex年龄age

成绩score
101zhangm1995.6
102zhaom2089.0
103wangf1896.5
104shanm2094.0
105chenf2076.5
106hanf1987.0
107cuim2078.8
108dingf1898.4
109chum1990.0
110gaom2097.3
程序代码如下:

#include<iostream>

#include<iomanip>

using namespace std;

struct STUDENT

{

int num;

char name[8];

char sex;

int age;

double score;

};

void sort(STUDENT *p[],int n)

{

int i,j,k;

struct STUDENT *w;

for(i=0;i<n-1;i++)

{

k=i;

for(j=i+1;j<n;j++)

if((*p[j]).score<(*p[k]).score)

k=j;

if(k!=i)

{

w=p[i];

p[i]=p[k];

p[k]=w;

}

}

return;

}

int main()

{

int i;

STUDENT stu[10]={{101,"zhang",'m',19,95.6},

{102,"zhao",'m',20,89.0},{103,"wang",'f',18,96.5},

{104,"shan",'m',20,94.0},{105,"chen",'f',20,76.5},

{106,"han",'f',19,87.0},{107,"cui",'m',20,78.8},

{108,"ding",'f',18,98.4},{109,"chu",'m',19,90.0},

{110,"gao",'m',20,97.3}};

struct STUDENT *p[10];

for(i=0;i<10;i++)

p[i]=&stu[i];

cout<<"NO. NAME SEX AGE SCORE\n";

cout<<setiosflags(ios::fixed);//浮点数以十进制小数形式输出

cout<<setiosflags(ios::left); //输出数据左对齐

cout<<setprecision(2); //小数点后两位

for(i=0;i<10;i++)

{

cout<<setw(8)<<(*p[i]).num<<setw(9)<<(*p[i]).name;

cout<<setw(8)<<(*p[i]).sex<<setw(8)<<(*p[i]).age;

cout<<setw(5)<<(*p[i]).score<<endl;

}

cout<<endl;

sort(p,10);

cout<<"NO. NAME SEX AGE SCORE\n";

for(i=0;i<10;i++)

{

cout<<setw(8)<<(*p[i]).num<<setw(9)<<(*p[i]).name;

cout<<setw(8)<<(*p[i]).sex<<setw(8)<<(*p[i]).age;

cout<<setw(5)<<(*p[i]).score<<endl;

}

return 0;

}

编程心得:

在本程序中,将学生信息定义为结构体类型变量,在函数的调用时,用结构体类型指针变量做函数参数,由于传送的是地址,因此,被调函数中改变结构体类型形参所指向的地址中的值也就改变了结构体类型指针实参所指向地址的值,即学生的排序得以改变。本例中,选择排序法也得到了重要的应用。

C/C++语言中,当数组作为函数的参数时,该参数退化为指针。因此下面二者相同:

C/C++ code

?
可见,当数组作为函数参数时,长度信息完全丢失。

解决方案有二:

1、增加第二个参数size_t length,把长度传入第二个参数中。该方法适合C,对于C++则不是很推荐。

2、放弃普通数组,使用vector。函数的参数改成vector &。该方法适用于C++,但无法在C中使用。

利用函数模板:

C/C++ code

?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: