下列程序的执行结果是()
#include <stdio.h>
#include <string.h>
struct S {
char name[10];
int num;
};
void f(char *name, int num)
{
struct S s[2]={{“abc”,1003},{“efg”,1004}};
num=s[0].num;
strcat(name,s[0].name);
}
int main()
{
struct S s[2]={{“123”,1000},{“4567”,1002}},*p;
p=s;
f(p->name,p->num);
if(strlen(p[0].name)>strlen(p[1].name))
printf(“%s %d\n”,p->name,p->num);
else{
printf(“%s %d\n”,p[1].name,p[1].num);
return (0);
}
}
本题选D。考察对指针的理解。
同时定义了一个指向结构体数组的指针变量p。
调用函数的语句:
f(p->name,p->num);
因为s是数组的首地址,p是指向s的指针,p->name,p->num就是取数组第一项的元素,值分别为“123”,1000。
在函数f中,第一个参数为char*类型,形参与实参结合的传递方式为:实参把地址复制一份给形参,在函数调用过程中,形参的值发生改变会影响实参。因此会改变原有的p->name的值。
第二个参数为int类型, 函数调用中发生的数据传递是单向的,在函数调用过程中,形参的值发生改变并不会影响实参。因此p->num的值不变。
因此在调用函数后,主函数中结构体数组s的第一项的两个元素的值分别为:“123abc“”及1000。
数组第一项的第一个元素的长度大于数组第二项的第一个元素的长度。所以输出第一项的元素的值。
即123abc 1000。
如下图,最终输出结果为123abc 1000。
综上本题选D。