问题 单项选择题

有以下程序
void f(int *x,int *y)
int t;
t=*x;*x=*y;*y=t;

main()
int a[8]=(1,2,3,4,5,6,7,8),i,*p,*q;
p=a,q=&a[7];
while(p
f(p,q); p++; q--;
for(i=0;i<8;i++)printf("%d,",a[i]);

程序运行后的输出结果是______。

A) 8,2,3,4,5,6,7,1,
B) 5,6,7,8,1,2,3,4,
C) 1,2,3,4,5,6,7,8, D) 8,7,6,5,4,3,2,1,

答案

参考答案:D

解析: 本题考查函数的传址调用。在C语言中,函数参数的默认传递方式是传值,函数内部的形参只是调用时实参的一个副本,形参改变后,实参不会变。另一种参数传递方式是传址,利用指针作为函数的参数,无论是形参指针还是实参指针,所指的都是同一个内存地址,所以如果形参改变了这个地址中的内容,实参所指的地址内容也会改变。本题程序中的函数f()就是利用传址的方式实现交换两个参数所指地址中的值。在主函数中,用p、q分别指向数组a的首和尾两个元素,然后在while循环中不断交换p、q所指的内容,每次交换后,p、q分别往后、往前移动一个元素,直到q不大于p,即两个指针在数组a的中间相遇。所以程序的运行结果是使a中的所有元素反序排列,选项D正确。

问答题
填空题