初阶函数基础例题(1)

文章详细讨论了C语言中函数返回值的处理,包括使用数组、指针或全局变量传递多个返回值,以及函数调用的传值和传址方式。同时,提到了函数嵌套调用和全局变量的作用域与生命周期。重点强调了形参和实参的关系,以及在函数设计中应遵循的原则,如高内聚低耦合和资源管理。

一、选择题

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语句中表达式的值不一致,则以函数类型为准(建议最好写成一样)

        ④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;局部变量不初始化的时候,默认为随机值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值