首页 > 试题广场 >

下列程序的执行结果是()

[单选题]

下列程序的执行结果是()

#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);
}
}
  • 4567 1002
  • efg 1004
  • 123abc 1003
  • 123abc 1000
推荐

本题选D。考察对指针的理解。

为方便阅读,贴一下代码:
#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);
    }
}
main函数中,首先定义了一个结构体数组s,即该数组的每个元素都是一个结构体。

同时定义了一个指向结构体数组的指针变量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。

编辑于 2020-02-26 19:11:10 回复(0)
选D。f函数将字符串“abc”拼接到输入字符串“123”后,而f函数num作为形参并不能改变传入的实参,不会将赋值后的num值传出
发表于 2020-02-27 17:49:03 回复(0)