第十三课(二)、C函数
来源:互联网 发布:淘宝客单页模板 编辑:程序博客网 时间:2024/06/06 11:03
第十三课(二)、C函数
13.5、函数参数
如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数。
形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。
当调用函数时,有两种向函数传递参数的方式:
调用类型
描述
传值调用
该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。
引用调用
通过指针传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。
默认情况下,C使用传值调用来传递参数。一般来说,这意味着函数内的代码不能改变用于调用函数的实际参数
传值调用:把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。
默认情况下,C语言使用传值调用方法来传递参数。一般来说,这意味着函数内的代码不会改变用于调用函数的实际参数。函数 swap() 定义如下:
/*函数定义 */
void swap(int x,int y)
{
int temp;
temp= x;/*保存 x的值 */
x = y; /*把 y赋值给 x */
y = temp;/*把 temp赋值给 y */
return;
}
通过传递实际参数来调用函数 swap():
#include<stdio.h>
/*函数声明 */
void swap(int x,int y);
int main()
{
/*局部变量定义 */
int a=100;
int b=200;
printf("交换前,a的值:%d\n", a );
printf("交换前,b的值:%d\n", b );
/*调用函数来交换值 */
swap(a, b);
printf("交换后,a的值:%d\n", a );
printf("交换后,b的值:%d\n", b );
return0;
}
当上面的代码被编译和执行时,产生下列结果:
交换前,a的值:100
交换前,b的值:200
交换后,a的值:100
交换后,b的值:200
实例中虽然在函数内改变了 a和 b的值,但是实际上 a和 b的值没有发生变化。
引用方式调用:形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。
传递指针可以让多个函数访问指针所引用的对象,而不用把对象声明为全局可访问。
/* 函数定义 */
void swap(int *x, int *y)
{
int temp;
temp = *x; /* 保存地址 x 的值 */
*x = *y; /* 把 y 赋值给 x */
*y = temp; /* 把 temp 赋值给 y */
return;
}
通过引用传值来调用函数 swap():
#include <stdio.h>
/* 函数声明 */
void swap(int *x, int *y);
int main ()
{
/* 局部变量定义 */
int a = 100;
int b = 200;
printf("交换前,a 的值: %d\n", a );
printf("交换前,b 的值: %d\n", b );
/* 调用函数来交换值
* &a 表示指向 a 的指针,即变量 a 的地址
* &b 表示指向 b 的指针,即变量 b 的地址
*/
swap(&a, &b);
printf("交换后,a 的值: %d\n", a );
printf("交换后,b 的值: %d\n", b );
return 0;
}
当上面的代码被编译和执行时,产生下列结果:
交换前,a 的值: 100
交换前,b 的值: 200
交换后,a 的值: 200
交换后,b 的值: 100
补充:
1、根据函数能否被其他源文件调用,将函数区分为内部函数和外部函数。
1.1、内部函数
如果一个函数只能被本文件中其他函数所调用,它称为内部函数。在定义内部函数时,在函数名和函数类型的前面加static,即
static 类型名 函数名 (形参表)
例如,函数的首行:
static int max(int a,intb)
内部函数又称静态函数。使用内部函数,可以使函数的作用域只局限于所在文件。即使在不同的文件中有同名的内部函数,也互不干扰。提高了程序的可靠性。
1.2、外部函数
如果在定义函数时,在函数的首部的最左端加关键字extern,则此函数是外部函数,可供其它文件调用。
如函数首部可以为
extern int max (int a,intb)
C语言规定,如果在定义函数时省略 extern,则默认为外部函数。
在需要调用此函数的其他文件中,需要对此函数作声明(不要忘记,即使在本文件中调用一个函数,也要用函数原型来声明)。在对此函数作声明时,要加关键字 extern,表示该函数是在其他文件中定义的外部函数。
Eg:
以下实例通过多个文件的函数实现输入一串字符串,然后删除指定的字符:
file1.c(文件1)
#include <stdio.h>
static void delete_string(char str[],char ch);
int main()
{
extern void enter(char str[]); // 对函数的声明
extern void print(char str[]); // 对函数的声明
char c,str[100];
enter(str);
scanf("%c",&c);
delete_string(str,c);
print(str);
return 0;
}
static void delete_string(char str[],char ch)//内部函数
{
int i,j;
for(i=j=0;str[i]!='\0';i++)
if(str[i]!=ch)
str[j++]=str[i];
str[j]='\0';
}
file2.c(文件2)
#include <stdio.h>
void enter(char str[100]) // 定义外部函数 enter
{
fgets(str, 100, stdin); // 向字符数组输入字符串
}
file3.c(文件3)
#include <stdio.h>
void print(char str[]) // 定义外部函数 print
{
printf("%s\n",str);
}
输入字符串"abcdef",给字符数组 str,在输入要删去的字符'd'。
运行结果:
$ gcc file1.c file2.c file3.c
$ ./a.out
abcdef # 输入的字符串
d # 要删除的字符
abcef # 删除后的字符串
2、内联函数
内联函数是指用inline关键字修饰的函数。在类内定义的函数被默认成内联函数。内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。
内联扩展是用来消除函数调用时的时间开销。它通常用于频繁执行的函数,对于小内存空间的函数非常受益。
使用内联函数的时候要注意:
1、递归函数不能定义为内联函数
2、内联函数一般适合于不存在while和switch等复杂的结构且只有1~5条语句的小函数上,否则编译系统将该函数视为普通函数。
3、内联函数只能先定义后使用,否则编译系统也会把它认为是普通函数。
4、对内联函数不能进行异常的接口声明。
示例:一个简单的交换函数
inline void swap(int *a, int *b)
{
int t = *a;
*a = *b;
*b = t;
}
- 第十三课(二)、C函数
- 第十三课(一)、C函数
- 第十三周任务(二)
- 第十三周任务(二)
- 第十三实验报告(二)
- 第十三周任务(二)
- 第十三题(sleep函数)
- 第十三题(sleep函数)
- C语言函数(二)
- [C++]函数对象(二)
- c语言(二)函数
- 第十三周实验报告(任务二)【虚函数与抽象类的应用】
- 第十三周项目二--形状类族中的虚函数
- 第十三周项目二 几何族类的纯虚函数
- 第十三周实验报告(二)
- 第十三周实验报告(任务二)
- 第十三周 任务二 (2-1)
- 第十三周项目一(二)
- qbxt国庆水题记day4
- JAVA一些的面试题
- 适合作为桌面的图片(from世安杯)
- ios-tableView的touchesBegan事件和didSelectRowAtIndexPath方法
- 65. Valid Number
- 第十三课(二)、C函数
- window.requestAnimFrame 以及Polyfill
- 第三章
- 手把手教你Adobe Acrobat Pro DC 2017中文版的官网下载、安装与注册机激活教程
- 软件工程
- 布隆过滤器(Bloom Filter)
- C++ PRIMER第五章课后练习
- 间接寻址的基本及其应用(实验2.4)
- 训练集--群赛17