将结构体传给函数的方式有以下三种:
目录
一、用结构体的单个成员作为函数参数,向函数传递结构体的单个成员
二、用结构体变量作函数实参,向函数传递结构体得完整结构
三、用结构体指针或结构体数组作函数参数,向函数传递结构体的地址。
一、用结构体的单个成员作为函数参数,向函数传递结构体的单个成员
用单个结构体成员作为函数实参,与普通类型的变量作为函数实参没什么区别,都是传值调用,在函数内部对其进行操作,不会引起结构体成员值得变化。
这种向函数体传递结构体得一个成员得方式,很少使用。
二、用结构体变量作函数实参,向函数传递结构体得完整结构
用结构体变量作函数实参,向函数传递得是结构体得完整结构,即将整个结构体成员得内容复制给被调函数。在函数内可用成员选择运算符引用其结构体成员。因这种传递方式也是传值调用,所以,在函数内对形参结构体成员值得修改,不会影响相应得实参结构体成员。
当实参和形参是同一种结构体类型时,才可以使用这种方式传递。当函数被调用时,系统为结构体形参变量分配得存储空间得大小由所定义得结构体类型决定。这种传递方式更直观,但因其占用的内存空间比较大,因而时空开销较大。
三、用结构体指针或结构体数组作函数参数,向函数传递结构体的地址。
(例题1演示作为函数参数,例题2演示作为函数返回值)
用指向结构体的指针变量或结构体数组作函数实参的实质是向函数传递给结构体的地址,因为是传地址调用,所以在函数内部对形参结构体成员值得修改,将影响到实参结构体成员的值。
由于仅复制结构体首地址一个值给被调函数,并不是将整个结构体成员的内容复制给被调函数,因此相对于第2种方式而言,这种传递方式效率更高。
例题1:编写程序用于演示结构体变量作函数参数实现传值调用。
#include <stdio.h>
struct date
{
int year;
int month;
int day;
};
void func(struct date p)
{
p.year=2000;
p.month=5;
p.day = 22;
}
int main(void)
{
struct date d;
d.year = 1999;
d.month = 4;
d.day = 23;
printf("Before function call:%d/%02d/%02d\n",d.year,d.month,d.day);
func(d);
printf("After function call:%d/%02d/%02d\n",d.year,d.month,d.day);
return 0;
}
可以看出,向函数传递结构体变量时,实际传递给函数的是该结构体变量成员值得副本,这就意味着结构体变量得成员值是不可能在被调函数中被修改的。和其他变量一样,仅当将结构体的地址传递给函数时,结构体变量的成员值才可以在被调函数中被修改。
修改后:
#include <stdio.h>
struct date
{
int year;
int month;
int day;
};
void func(struct date *p)
{
p->year=2000;
p->month=5;
p->day = 22;
}
int main(void)
{
struct date d;
d.year = 1999;
d.month = 4;
d.day = 23;
printf("Before function call:%d/%02d/%02d\n",d.year,d.month,d.day);
func(&d);
printf("After function call:%d/%02d/%02d\n",d.year,d.month,d.day);
return 0;
}
例题2:结构体除了可作为函数参数的类型意外,还可作为函数返回值的类型。
#include <stdio.h>
struct date
{
int year;
int month;
int day;
};
struct date Func(struct date p)
{
p.year=2000;
p.month = 5;
p.day = 29;
return p;
}
int main(void)
{
struct date d;
d.year = 1999;
d.month = 4;
d.day = 23;
printf("Before function call:%d/%02d/%02d\n",d.year,d.month,d.day);
d = Func(d);
printf("After function call:%d/%02d/%02d\n",d.year,d.month,d.day);
return 0;
}
例题3:使用结构体数组所函数参数编程并输出计算学生的平均分。
#include <stdio.h>
#define N 30
typedef struct date
{
int year;
int month;
int day;
}DATE;
typedef struct student
{
long studentID;
char studentName[10];
char studentSex;
DATE birthday;
int score[4];
}STUDENT;
void InputScore(STUDENT stu[],int n,int m);
void AverScore(STUDENT stu[],float aver[],int n,int m);
void PrintScore(STUDENT stu[],float aver[],int n,int m);
int main(void)
{
float aver[N];
STUDENT stu[N];
int n;
printf("How many student?");
scanf("%d",&n);
InputScore(stu,n,4);
AverScore(stu,aver,n,4);
PrintScore(stu,aver,n,4);
return 0;
}
void InputScore(STUDENT stu[],int n,int m)
{
int i,j;
for(i=0;i<n;i++)
{
printf("Input record %d:\n",i+1);
scanf("%ld",&stu[i].studentID);
scanf("%s",stu[i].studentName);
scanf(" %c",&stu[i].studentSex);
scanf("%d",&stu[i].birthday.year);
scanf("%d",&stu[i].birthday.month);
scanf("%d",&stu[i].birthday.day);
for(j=0;j<m;j++)
{
scanf("%d",&stu[i].score[j]);
}
}
}
void AverScore(STUDENT stu[],float aver[],int n,int m)
{
int i,j,sum[N];
for(i=0;i<n;i++)
{
sum[i]=0;
for(j=0;j<m;j++)
{
sum[i]=sum[i]+stu[i].score[j];
}
aver[i]=(float)sum[i]/m;
}
}
void PrintScore(STUDENT stu[],float aver[],int n,int m)
{
int i,j;
printf("Reaults: \n");
for(i=0;i<n;i++)
{
printf("%10ld%8s%3c%6d/%02d/%02d ",stu[i].studentID,
stu[i].studentName,
stu[i].studentSex,
stu[i].birthday.year,
stu[i].birthday.month,
stu[i].birthday.day);
for(j=0;j<m;j++)
{
printf("%4d",stu[i].score[j]);
}
printf("%6.lf\n",aver[i]);
}
}