大标题即所对应知识点
一、形参和实参
1.1题目讲解
A、正确。实参可以为常量、变量和表达式,无论是哪个只要可以向形参传值都可以。
B、错误。形参不能为表达式,在C语言中,形参可以是变量或指针,但不能是常量或表达式。形参用于接收函数调用中传递的实际参数的值。
C、正确。实参可以为任意类型为形参传值,但要确保D中的类型一致问题。
D、正确。形参的类型通常应与对应实参的类型保持一致,以确保正确的数据传递和操作。形参的类型决定了函数在被调用时所接收的数据类型。
1.2实参和形参相关知识点
二、函数
1.1题目讲解
A、错误。void prt_cahr没有错误,它是函数创建语句,不是调用语句,void是因为返回值为void(0)。
B、 错误。变量名可以用大写字母。
C、正确。函数说明是返回值为void 类型的函数,但是在函数调用语句那里是将返回值赋给k,所以k不会被赋值,矛盾由此而来。
D、错误。函数名可以用下划线。
1.2 函数相关知识点
三、函数的嵌套和调用关系
A、错误。函数的定义不可以嵌套,函数的调用可以嵌套。
B、正常。函数的定义不可以嵌套,函数的调用可以嵌套。
C。答案如上。
D、答案如上。
讲解知识点:
C语言中的函数定义确实是不允许嵌套的,这意味着不能在一个函数内部再定义另一个函数。函数的定义必须在全局作用域或另一个函数的外部。
然而,函数调用却可以嵌套,即一个函数可以在另一个函数内部进行调用。这是因为函数调用过程是按照栈的形式进行的,每当一个函数被调用时,它的调用信息会被压入栈中,函数执行完毕后再弹出。因此,函数的调用可以像嵌套的盒子一样,一个函数调用可以出现在另一个函数的内部,形成多层嵌套的调用。
以下是一个函数调用的嵌套用法:
#include <stdio.h> void functionB() { printf("This is function B.\n"); } void functionA() { printf("This is function A.\n"); functionB(); // 在函数A中调用函数B } int main() { printf("This is the main function.\n"); functionA(); // 在main函数中调用函数A return 0; }
在上述示例中,main
函数调用functionA
,而functionA
又调用了functionB
,从而实现了函数调用的嵌套。
虽然函数调用可以嵌套,但嵌套过深可能会导致代码可读性降低以及调试困难。因此,在实际编程中,我们应该谨慎使用函数调用的嵌套,遵循代码简洁、可读性好的原则。
四、有返回值函数的使用
A、函数调用可以作为独立的语句存在,这表示我们可以仅仅调用一个函数而不接收其返回值。
B、函数调用可以作为一个函数的实参,这意味着我们可以将一个函数的调用作为另一个函数的参数传递。
C、函数调用可以出现在表达式中,这意味着我们可以用函数调用的返回值参与到表达式的运算中。
D、错误。函数调用虽然不能直接作为一个函数的形参,但可以定义函数指针作为形参,然后将函数调用通过函数指针传递给该形参。
五、函数命名
A、错误。void play(var:Interger, var b:Integer)这种写法不符合C语言的语法规范,参数类型应该使用C语言的数据类型(int double float....),而不是var:、Interger等。
B、错误。void play(int a,b) — 这种写法参数列表缺少参数类型,应该为每个参数指定数据类型。
C、正确。
D、错误。不符合C语言的语法规范
六、传参方式
A. 地址传递:地址传递是指将实参的地址传递给形参,形参通过该地址可以直接访问和修改实参的值。在C语言中,可以通过传递指针来实现地址传递。但是针对该选项而言,并未提到任何关于地址传递的内容,因此选项 A. 地址传递不是正确答案。
B. 单向值传递:单向值传递是指将实参的值复制一份传递给形参,形参在函数内部使用的是这个副本。这种传递方式是C语言中最常见和默认的方式,也被广泛应用。因此,选项 B. 单向值传递是正确答案。
C. 由实参传给形参,再由形参传回实参:描述中提到先将实参传递给形参,然后再由形参传回实参,但并未具体说明何种传递方式。根据常规情况,函数调用过程中并不直接有形参传回实参的操作,而是通过返回值来传递结果。因此,选项 C. 由实参传给形参,再由形参传回实参 不是正确答案。
D. 传递方式由自己指定:C语言提供了多种传递方式,如单向值传递、地址传递等。但在函数调用时,默认情况下使用的是单向值传递。如果需要其他传递方式,可以通过传递指针或引用等方式来实现。选项 D. 传递方式由用户指定 不是正确答案,因为在通常情况下,如果不特别指定,C语言函数调用会采用单向值传递。
七、含函数程序运行结果分析
函数 fun
接收三个整数类型的参数 a、b、c,并在函数内部将其分别赋值为 456、567、678。而在 main
函数中,定义了三个整数类型的变量 x、y、z,并将其分别初始化为 10、20、30。然后,调用了 fun(x, y, z)
函数,将变量 x、y、z 的值传递给函数的对应形参。
但是,在 C 语言中,函数参数的传递方式是通过单向值传递,即函数内部的形参在被赋值时,只是修改了形参的副本,不会对原始实参产生影响。因此,在 fun
函数的执行过程中,对形参 a、b、c 的修改不会对变量 x、y、z 产生影响。
所以,最后的 printf
语句输出的结果应为变量 x、y、z 的初始值,即 "10, 20, 30"。因此,正确的选项是 B.
八、函数定义
A. int f(int x;int y) — 这个选项使用了分号 ;
而不是逗号 ,
来分隔参数,这是语法错误的
B、int f(int x, y) — 这个选项在函数定义中只给出了一个参数 x 的类型,而没有给出第二个参数 y 的类型,这也是语法错误的
C、正确。
D. int f(x, y:int) — 这个选项使用了 :
来分隔参数的类型和名称,而在C语言中应使用逗号 ,
分隔参数的类型和名称
九、函数参数
关于函数参数,说法正确的是
- A. 实参与其对应的形参各自占用独立的内存单元
- B. 实参与其对应的形参共同占用一个内存单元
- C. 只有当时参合形参同名时才占用一个内存单元
- D. 形参时虚拟的,不占用内存单元
在C语言中,每当调用函数时,实参的值会被复制一份传递给函数的形参,形参在函数内部使用的是这个副本。实参和形参是两个独立的变量,它们在内存中分别占用不同的内存单元。
这意味着,函数内部对形参的修改不会影响到实参的值,而实参在函数调用之前的值也不会受到函数内部对形参的修改的影响。因此,实参和形参之间是相互独立的。
但是,如果参数是指针类型,那么实参和形参指向的是同一块内存地址,可以通过指针来修改实参指向的数据。但是,实参和形参仍然是独立的变量,它们在内存中分别占用不同的内存单元。
所以,选项 B. 实参与其对应的形参共同占用一个内存单元 是不正确的,选项 C. 只有当实参和形参同名时才占用一个内存单元 也是不正确的,选项 D. 形参是虚拟的,不占用内存单元 也不正确。
因此,正确的说法是 A. 实参与其对应的形参各自占用独立的内存单元。
十、函数返回值
总而言之:一个函数的返回值由return语句中的表达式确定