目录
七.函数参数传递常用的三种方式(此次只说明C语言中可使用的两个,c++的引用传递后续再写):
一.函数定义:
1.函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。
2.您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。
3.函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。
4.C 标准库提供了大量的程序可以调用的内置函数。例如,函数 strcat() 用来连接两个字符串,函数 memcpy() 用来复制内存到另一个位置。
二.定义函数:
#include<stdio.h>
int main()
{
printf;
char a = 0;
int b = 0;
float c = 0.0;
scanf_s("%c %d %f",&a,&b,&c);
printf("%c %d %f ", a, b, c);
return 0;
}
在 C 语言中,函数由一个函数头和一个函数主体组成。
下面列出一个函数的所有组成部分:
1.返回类型:
一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void。
2.函数名称:
这是函数的实际名称。函数名和参数列表一起构成了函数签名。
3.参数:
参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
4.函数主体:
函数主体包含一组定义函数执行任务的语句。
5.例子:
以下是 max() 函数的源代码。该函数有两个参数 num1 和 num2,会返回这两个数中较大的那个数:
/* 函数返回两个数中较大的那个数 */
int max(int num1, int num2)
{
/* 局部变量声明 */
int result;
if (num1 > num2) {
result = num1;
} else {
result = num2;
}
return result;
}
三.函数声明:
函数声明会告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。
return_type function_name( parameter list );
//针对上面定义的函数 max(),以下是函数声明:
int max(int num1, int num2);
//在函数声明中,参数的名称并不重要,只有参数的类型是必需的,因此下面也是有效的声明:
int max(int, int);
当您在一个源文件中定义函数且在另一个文件中调用函数时,函数声明是必需的。在这种情况下,您应该在调用函数的文件顶部声明函数。
四:调用函数:
1.定义:
创建 C 函数时,会定义函数做什么,然后通过调用函数来完成已定义的任务。
2.函数调用说明:
由于程序是从上向下执行,所以函数要先声明,后调用。这种先后是文档中所处位置的先后,不是时间的先后。
3.实列对比:
写法正确:
#include<stdio.h>
void f(void) /*定义函数*/
{
printf("我是一个函数,我将在主函数中输出\n");
}
int main(void)
{
f(); /*调用函数*/
}
在上面这个实例中,在主函数中调用了函数 f(), 而函数的声明是在调用以前。
写法错误:
#include<stdio.h>
int main(void)
{
f();/*调用函数*/
}
void f(void) /*定义函数*/
{
printf("我是一个函数,我将在主函数中输出\n");
}
在上面这个实例中,在主函数中调用了函数 f(), 而函数的声明却在调用之后。由于函数执行时是从上往下执行的所以,这写法是错误的。
如果函数非要写在主函数之后可以在主函数之前加入一个函数的前置声明。
五:内部函数与外部函数:
定义:根据函数能否被其他源文件调用,将函数区分为内部函数和外部函数。
1.内部函数:
如果一个函数只能被本文件中其他函数所调用,它称为内部函数。在定义内部函数时,在函数名和函数类型的前面加 static,即
static 类型名 函数名 (形参表)
例如:
//函数的首行:
static int max(int a,int b)
内部函数又称静态函数。使用内部函数,可以使函数的作用域只局限于所在文件。即使在不同的文件中有同名的内部函数,也互不干扰。提高了程序的可靠性。
2.外部函数:
如果在定义函数时,在函数的首部的最左端加关键字 extern,则此函数是外部函数,可供其它文件调用。
//如函数首部可以为
extern int max (int a,int b);
C 语言规定,如果在定义函数时省略 extern,则默认为外部函数。
在需要调用此函数的其他文件中,需要对此函数作声明(不要忘记,即使在本文件中调用一个函数,也要用函数原型来声明)。在对此函数作声明时,要加关键字 extern,表示该函数是在其他文件中定义的外部函数。
3.交换函数:
inline void swap(int *a, int *b)
{
int t = *a;
*a = *b;
*b = t;
}
六:函数参数:
1.定义:
(1):如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数。
(2):形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。
2.当调用函数时,有两种向函数传递参数的方式:
调用类型 | 描述 |
---|---|
传值调用 | 该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。 |
引用调用 | 通过指针传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。 |
默认情况下,C 使用传值调用来传递参数。一般来说,这意味着函数内的代码不能改变用于调用函数的实际参数。
3.关于 main 函数的参数:
在有些很专业的书会看到如下代码
int main (void)
上面的代码中 main 函数带了参数。
但是有时又会看见main函数没有参数,如下:
int main()
那么 main 函数到底有没有参数,有没有参数会不会有什么影响?
与c不同,在c++中,上述两个程序均无法编译,在c++中,fun() 和 fun (void)都是相同的。
因此区别在于,在C语言中可以使用任意数量的参数来调试int main (),但是只能在不使用任何参数的情况下调用int main (void),尽管大多数情况下并没有什么区别,但是在C语言中建议使用“int main (void)”。
七.函数参数传递常用的三种方式(此次只说明C语言中可使用的两个,c++的引用传递后续再写):
示例程序均以交换两个整数为例
1.值传递:
#include <stdio.h>
void swap(int x, int y);
void swap(int x, int y)
{
int temp;
temp = x;
x = y;
y = temp;
}
int main( int argc, char *argv[] )
{
int a = 5;
int b = 10;
swap(a, b); //调用交换函数
printf("交换结果为 a = %d, b = %d\n",a,b);
return 0;
}
由于值传递是单向传递,传递过程中只是改变了形参的数值,并未改变实参的数值,因此并不会改变a和b原有的值。
2. 指针传递:
#include <stdio.h>
void swap(int *x, int *y);
void swap(int *x, int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
int main( int argc, char *argv[] )
{
int a = 5;
int b = 10;
swap(&a, &b); //调用交换函数
printf("交换结果为 a = %d, b = %d\n",a,b);
return 0;
}
指针传递过程中,将a和b的地址分别传递给了x和y,在函数体内部改变了a、b所在地址的值,即交换了a、b的数值。
八.占位符总结:
占位符就是先占住一个固定的位置,等着你再往里面添加内容的符号,广泛用于计算机中各类文档的编辑。其意义就是起到格式占位的意思,表示在该位置有输入或者输出。
1. %d, %i 代表整数
2.%f 浮点
3.%s 字符串
4.%c char
5.%p 指针
6.%fL 长log
7.%e 科学计数
8.%g 小数或科学计数。
9.%a,%A 读入一个浮点值(仅C99有效)。
10.%c 读入一个字符。
11.%d 读入十进制整数。
12.%i 读入十进制,八进制,十六进制整数。
13.%o 读入八进制整数。
14.%x,%X 读入十六进制整数。
15.%s 读入一个字符串,遇空格、制表符或换行符结束。
16.%f,%F,%e,%E,%g,%G 用来输入实数,可以用小数形式或指数形式输入。
17.%p 读入一个指针。
18.%u 读入一个无符号十进制整数。
19.%n 至此已读入值的等价字符数。
20.%[] 扫描字符集合。
21.%% 读 % 符号
九.总结:
今天C语言函数学习就到这里。