05 函数与指针
本章内容:
¨ 掌握函数概念及函数应用
¨ 会应用C语言的内置函数
¨ 熟练使用C语言中的自定义函数
¨ 理解函数参数及参数的传递方式
¨ 理解指针的概念
¨ 基本掌握指针的用法
¨ 理解指针和数组的关系
¨ 基本掌握指针作为函数参数的用法
一、函数机制的优点
¨使程序变得更简短而清晰
¨有利于程序维护
¨可以提高程序开发的效率
¨提高了代码的重用性
二、C语言中函数类型
常用内置函数:
三、函数定义
函数定义类型:
¨有返回值,有参数; int add(int a, int b)
¨有返回值,无参数; int add()
¨无返回值,有参数; void add(int a, int b)
¨无返回值,无参数; void add()
四、函数使用
(一)、函数原型说明:
• 函数原型说明在形式上与函数头部类似,最后加一个分号。原型说明中参数表里的参数名可以不写(只写参数类型)
(二)、函数调用
¨ 通过在程序中使用函数名称,可以执行函数中包含的语句,这称为调用函数
¨ 函数之间允许相互调用,也允许嵌套调用从一个函数调用另一个函数称为函数的嵌套调用
¨ 函数还可以自己调用自己,称为递归调用
(三)、函数的参数
¨ 函数有时要求用户传入数据,这些数据是函数的参数
¨ 函数的参数分为形式参数和实际参数,函数定义中声明的参数为形式参数,函数调用时传入的参数为实际参数
函数调用时传参的方式:
¨ 值传递
将实参拷贝一份赋值给形参
主调函数向调用函数传递参数实际上只是将实参的拷贝(即临时副本)传递给了被调用函数,并不是实参本身,这样被调函数不能直接修改主调函数中变量的值,而只能修改其私有的临时副本的值。
¨ 址传递
让形参和实参共享一片内存空间,即内存地址相同
引用传递是将实参地址的拷贝传递给被调用函数,在被调用函数中可以通过地址对其值进行修改。
对引用的操作等于对其制定的对象进行操作,当将实参传递给形参时,形参就指向了实参。
注意:
1、C语言中实参和形参之间的额数据传递是单向的“值传递”,单向传递,只能由实参传给形参,反之不能。
2、被调用函数的形参只有函数被调用时才会临时分配存储单元,一旦调用结束占用的内存便会被释放。
3、不论是“按值传递”还是“按地址(指针)传递”,传递的都是实参的一个拷贝。
(四)、函数值的返回
¨ 函数可以有返回值也可以没有返回值
¨ 当函数有返回值的时候其返回值的类型在函数定义时指定,在函数体内部由return语句进行返回操作
¨ 当函数没有返回值时,用void关键字标识
(五)、变量的作用域
¨变量的有效范围
¨变量的作用域决定了变量在某个程序块中的可访问性
五、指针
(一)、两个关键的运算符:
¨ & 取地址符
int i = 10; &i;
以上代码片段会得到变量i的地址(指针)
¨ * 指针运算符(间接运算符)
int *p_i;
p_i = &i;
*p_i;
以上代码将变量i的地址存放在指针变量p_i中,即让指针变p_i指向变量i。最后一句使用了指针运算符*,*p_i其实就是变量i
(二)、 指针变量和变量的指针:
¨用来存放地址的变量称为指针变量
¨变量的指针就是变量的地址
¨指针变量的定义与引用
int i = 10; int *p_i; p_i = &i;(指针变量) *p_i = 20;
(三)、指针运算
¨指针的赋值运算:
指针变量之间可以进行赋值运算,指针变量的赋值结果为让两个指针变量指向同一片内存空间。
¨指针的算数运算:
指针变量也可以像一般的变量一样进行++运算或加上一个整数的运算,但是指针的算术运算和普通算术运算的含义不同,指针的运算是让指针变量的值加上一个T类型变量所占用的内存大小的值,即使指针移动了一个T型单位变量的位置,指针的算术运算常用来操作数组元素。
¨指针的关系运算符:
指针的关系运算一般只做“==”的运算,判断两个指针是否指向同一片内存空间
指针变量作为函数参数
(四)、指针变量作为函数参数
¨函数的参数不仅可以是整型/实型等数据类型指针类型,也能作为函数的参数
¨指针变量作为函数参数,调用时是将实参的地址传递给了形参即传址的调用方式,此时形参和实参共享一片内存空间,当在函数内部改变形参的值时也就改变了实参的值
(五)、指向数组的指针