一、选择题
1、能把函数处理结果的二个数据返回给主调函数,在下面的方法中不正确的是:( )
A.return 这二个数
B.形参用数组
C.形参用二个指针
D.用二个全局变量
答案解析:
答案:A
A、一个函数可以有一个或多个return语句,但是只有一个起作用。故A错
B、形参用数组,可以将函数处理的两个结果返回给主调函数;
代码实例:
#include<stdio.h> void test(int arr[]) { arr[0] = 1; arr[1] = 2; } int main() { int arr[2] = { 0 }; test(arr); printf("%d %d\n", arr[0], arr[1]); return 0; }
C、形参用两个指针,可以将函数处理的两个结果返回给主调函数
代码实例:
#include<stdio.h> void test(int* pa, int* pb) { *pa = 2; *pb = 3; } int main() { int a = 0; int b = 0; test(&a, &b); printf("%d %d\n", a, b); return 0; }
D、用两个全局变量,可以将函数处理的两个结果返回给主调函数
代码实例:
#include<stdio.h> int x = 0; int y = 0; void test() { x = 3; y = 4; } int main() { test(); printf("%d %d\n", x, y); return 0; }
知识点:
1、函数的返回值:
①函数的返回值是通过函数中的return语句获得的。
②一个函数中可以有一个或多个return语句,但是只有一个起作用。(先执行到哪个return语句,就是哪个return语句起作用)
③如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准(建议最好x写成成一样)
④void:
a.作为函数类型:说明函数调用完后,什么后不需要返回
b.作为形参:说明函数没有参数,在调用的时候不能传参
2、函数调用
①传值调用:函数的形参和实参分别占用不同内存块,对形参的修改不会影响实参
②传址调用:
a.传址调用是把函数外部创建变量的内存地址传递给函数参数(形参)的一种调用函数的方式。
b.这种传参方式可以让函数和函数外边的变量建立真正的联系,也就是函数内部可以直接操作函数外部的变量
总结:传值调用-->形参不影响实参,传址调用-->形参可以影响实参
3、当数组传参的时候,实际上是把数组的首元素的地址传递过去了。(即为传址调用)
4、全局变量
①作用域:整个工程(注:同名时局部优先)
②生命周期:(作用域:在main整个范围均可用)=main的生命周期=程序的生命周期
2、关于函数调用说法不正确的是:( )
A.函数可以传值调用,传值调用的时候形参是实参的一份临时拷贝
B.函数可以传址调用,传址调用的时候,可以通过形参操作实参
C.函数可以嵌套定义,但是不能嵌套调用
D.函数可以嵌套调用,但是不能嵌套定义
答案解析:
A:正确,形参按照值的方式传递,形参就是实参的一份临时拷贝,修改形参不会影响外部的实参
B:正确,形参按照指针方式传递,形参就是实参地址的一份拷贝,形参指向的是实参,修改形参指针指向的内容, 就是在操作实参
C:错误,C语言中,函数不能嵌套定义
D:正确,函数可以嵌套调用,即:A()中调用B(),B()中调用A(),但是要控制好,否则就成为无限递归
因此,选择C
知识点:
1、形参与实参占用不同的内存单元,单向传递(实参传给形参)
2、形参只是实参的一份临时拷贝
3、函数可以嵌套调用,但是不能嵌套定义
4、传值调用-->形参不影响实参,传址调用-->形参可以影响实参
3、在函数调用时,以下说法正确的是:( )
A.函数调用后必须带回返回值
B.实际参数和形式参数可以同名
C.函数间的数据传递不可以使用全局变量
D.主调函数和被调函数总是在同一个文件里
答案解析:
A:错误,函数可以没有返回值,返回类型为void
B:正确,形参和实参在不同的函数中,即是不同的作用域,因此形参和实参可以同名
C:错误,如第一个选择题1D选项
D:错误,可以放在其他.c文件中
因此,选择B
知识点:
1、在真正的工程中,我们一般是:
头文件:.h--放置函数的声明
源文件:.c--放置函数的实现(定义)
2、形参和实参可以同名:因为每一个函数的局部变量互相是看不到的,作用域不一样
3、函数没有返回值,一定要在前面写void(否则默认类型为int)
4、关于实参和形参描述错误的是:( )
A.形参是实参的一份临时拷贝
B.形参是在函数调用的时候才实例化,才开辟内存空间
C.改变形参就是改变实参
D.函数调用如果采用传值调用,改变形参不影响实参
答案解析:
A:正确,传参时不论是按照值还是指针方式传递,形参拿到的都是实参的一份拷贝
B:正确,函数没有调用时,形参没有空间
C:错误,如果是按照值的方式传递,形参和实参之间没有联系,改变形参不能改变外部的实参
D:正确,因为形参和实参是两个不同的变量
知识点:
1、实际参数
①真正传给函数的参数,叫实参。
②实参可以是:常量、变量、表达式、函数等(但注意:无论实参是什么类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传递给形参)
2、形式参数(形参)
①形参是指(定义函数)函数名括号中的变量
②形参只有在函数被调用的过程中才实例化(分配内存单元),所以叫形参
③形参是局部变量:形参当函数调用之后就自动销毁了,因此形参只在函数中有效
补充:
①形参与实参类型一致、顺序对应、个数相同
②在被定义的函数中,必须指定形参的类型
③若形参与实参类型不一致,自动按形参类型转换
④形参与实参占用不同的内存单元,单向传递(实参传给形参);所以形参实例化之后其实就相当于实参的一份临时拷贝
5.以下关于函数设计不正确的说法是:( )
A.函数设计应该追求高内聚低耦合
B.要尽可能多的使用全局变量
C.函数参数不易过多
D.设计函数时,尽量做到谁申请的资源就由谁来释放
答案解析:
A:正确,高内聚低耦合即:函数体内部实现修改了,尽量不要对外部产生影响,否则:代码不方便维护(就是各模块之间尽量独立)
B:错误,全局变量在工程中到处都可以使用,很难保证数据的正确性和安全性
C:正确,参数越少越好,否则用户在使用时体验不是很好,还得必须将所有参数完全搞明白才可以使用(就是使用不方便)
D:正确,谁申请的谁维护谁释放,否则如果交给外部使用者释放,外部使用者可能不知道或者忘记,就会造成资源泄漏
因此,选择B
6、C语言规定,在一个源程序中,main函数的位置( )
A.必须在最开始
B.必须在库函数的后面
C.可以任意
D.必须在最后
答案解析:
main函数的位置可以在任意位置,但是如果在主函数之中调用了哪些函数,必须在main函数前对其所调用函数进行声明或包含其被调用函数的头文件。
因此:选择C
7、以下叙述中不正确的是:( )
A.在不同的函数中可以使用相同名字的变量
B.函数中的形式参数是在栈中保存
C.在一个函数内定义的变量只在本函数范围内有效
D.在一个函数内复合语句中定义的变量在本函数范围内有效(复合语句指函数中的成对括号构成的代码)
答案解析:
A:正确 不同的函数属于不同的作用域,因此不同的函数中定义相同名字的变量不会冲突
B:正确
C:正确 在函数内定义的变量,称为局部变量,局部变量只能在其定义的函数中使用
D:错误 复合语句中定义的变量只能在复合语句中使用
因此:选择D
知识点:在全局变量与静态变量不初始化默认为0;局部变量不初始化的时候,默认为随机值