【正确答案】
【答案解析】同类型的结构数组名。
[解析] 此题的解题要点有二:(1)指针用来存放变量的内存地址,结构指针自然就用来存放同类型结构变量的内存首地址。(2)结构数组名本身也是结构指针,其值是该数组的第一个元素的首地址;结构数组的每一个元素都是一个结构变量,因此结构数组名所存放的地址自然是结构变量的首地址,可以作为实参传递给对应的结构指针形参。这种参数的传递方式使得被调函数获得了主调函数定义的结构数组的首地址,从而可以操纵该结构数组。
本题考查函数、结构类型和指针的综合应用,这种综合应用很常见也很重要,我们可以通过下面的例子加深对这种综合应用的认识和理解。请特别关注加了注释的语句行,同时也请关注函数调用中的输出以及调用后的输出(总计4个输出)。传递结构指针或传递结构数组名,可能引起被调函数对主调函数结构变量的值和结构数组元素成员的值的修改,而且这种修改能被主调函数感知,这就是数据的双向传递效果。
#include<stdio.h>
struct S
{
int a;
char b;
};
void f1(struct S*);
void f2(struct S*);
int main()
{
struct S s1={1, "a"}, *s2, s3[2]={1, "a", 2, "b"};
f1(s1); /*错误*/
s2=&s1; /*将s1的首地址赋予s2*/
f1(s2); /*等价于f1(&s1);*/
printf("[2]s1.a=%d/n", s1.a);
f2(s3);
printf("[4] s3[0].a=%d/n", s3[0].a);
return 0;
}
void f1(struct S*p) /*或void f1(struct S p[])*/
{
printf("[1]s.a=%d/n", p->a);
p->a=2; /*给main函数的s1.a重新赋值*/
}
void f2(struct S*p1)
{
print("[3] p1[0].a=%d/n", p1[0].a);
p1[0].a=2; /*给main函数的s3[0].a重新赋值*/
}