C++ 结构体数组 引用类型作为函数形参时,编译错误,提示“引用”使用的不对

#include<iostream>
using namespace std;
struct student
{
char name[10];
int num;
int score[3];
};

int main()
{
void print(student &pstud[]);
student stu[5];
int i,j;
cout<<"input the students' information :\n";
cout<<"name num score"<<endl;
for(i=0;i<5;i++)
{
cin>>stu[i].name>>stu[i].num;
for(j=0;j<3;j++)
cin>>stu[i].score[j];
}

print(stu);
return 0;
}

void print(student &pstud[])///////////////结构体"引用"作为函数形参
{
int i,j;
for(i=0;i<5;i++)
{
cout<<"name :"<<(*(pstud+i)).name<<endl<<"NO."<<(pstud[i]).num<<endl;
for(j=0;j<3;j++)
cout<<"score "<<j+1<<':'<<(pstud[i]).score[j]<<endl;

cout<<endl<<endl;

}
}

哪位高手能帮忙告诉我怎么使用“引用”解决这个问题吗?当然用指针也可以解决这个问题,但我想知道“引用”怎么解决这个问题

只要把print函数定义和声明处的参数中 & 符号去掉就行了,你加上这个符号愿意可能是想按引用使用参数,但是pstud[]是数组,直接使用它就是使用他的地址,也即按引用使用,所以不必加它。
而你非要用&,则相当于传递了一个指针,但是这个类型的指针并不是指向pstud结构体的指针,而是指向pstud[]类型的指针,这么说如果不理解,建议你去研究一下二维数组和指向指针的指针
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-05-08
把程序中的所有的:
void print(student &pstud[])

都改为:
void print(student (&pstud)[])

即可。

(共修改两处, 一处main()函数中的声明,另一处就是后面的定义)追问

我的环境是VC6.0,按照你说的这种方式还是编译不能通过!

追答

程序修改如下 :

#include
using namespace std;
struct student
{
char name[10];
int num;
int score[3];
};

int main()
{
void print(student (&pstud)[5]); ///////注意这里
student stu[5];
int i,j;
cout>stu[i].name>>stu[i].num;
for(j=0;j>stu[i].score[j];
}

print(stu);
return 0;
}

void print(student (&pstud)[5])//////注意这里
{
int i,j;
for(i=0;i<5;i++)
{
cout<<"name :"<<(*(pstud+i)).name<<endl<<"NO."<<(pstud[i]).num<<endl;
for(j=0;j<3;j++)
cout<<"score "<<j+1<<':'<<(pstud[i]).score[j]<<endl;

cout<<endl<<endl;

}
}

追问

使用结构体名作为函数形参时,不需要限定数组大小呀,即void print(student pstud)[])这样就可以,为什么“引用”时需要限定数组大小呢?即void print(student (&pstud)[5])

很是不解!请指点!

追答

如果参数是数组的引用,那么编译器不会将它转换为指针,而是直接传递数组本身,也就是说,数组的长度不可省略,编译器将检查传入函数的实际数组参数的长度和函数的形式参数的长度是否匹配。

参考资料:<C++ Primer 4th Edition >, page 239

本回答被提问者采纳
相似回答