问题 单项选择题

有以下程序 point(char *p) { p+=3; } main() { char b[4]={'a'.'b','c','d'}, *p=b; point(p); printf("%c\n",*p); } 程序运行后的输出结果是

A.a

B.b

C.c

D.d

答案

参考答案:A

解析: 本题是一个陷阱,看似考查函数的传址调用,其实考的是传值调用。在C语言中,不管你给函数传递的参数是什么,指针也好数组名也罢,系统都是严格的将实参的值复制了一份作为函数的形参, 即传值调用。在函数中,对形参中的值怎么改变都不会影响到实参。那传址调用又是怎么实现的呢那是因为在函数中改变的不是形参指针变量中的值,而是形参指针变量所指内存中的值。其实骨子里还是将实参指针的值复制一份给形参指针变量,它们是两个独立的互不相干的变量,只不过指向的内存地址值一模一样罢了。本题的函数只是改变了形参指针变量p的值,这对程序没有任何影响,主函数中p一开始就是指向 b[0],最后输出时还是b[0]的值'a'。所以应该选择A。

单项选择题
单项选择题