内容正文:
第9章 指针
第9章 指针
指针变量
野指针与空指针
指针变量作形参
指针作函数的返回值
地址参与运算
指针与一维数组
一维数组作形参
指针与二维数组++
指向指针类型的指针
main函数和命令行参数
指向函数的指针变量
使用堆空间
典型命题
指向函数的指针变量
我们讨论指向函数的指针变量。
3
9.7 指向函数的指针变量
函数也需存储,用于存放函数的存储单元位于内存的代码区。函数在内存中也用相邻的字节存放,与数组名类似,函数名的值在C语言中也被规定为存储该函数的存储单元的首字节地址。
指向函数的指针变量就是指向存储了函数的存储单元的指针变量。通过指向函数的指针变量也能以间接引用的方式使用相关的存储单元,调用函数。
函数也需存储,用于存放函数的存储单元位于内存的代码区。函数在内存中也用相邻的字节存放,与数组名类似,
函数名的值在C语言中也被规定为存储该函数的存储单元的首字节地址。
指向函数的指针变量就是指向存储了函数的存储单元的指针变量。
通过指向函数的指针变量也能以间接引用的方式使用相关的存储单元,调用函数。
4
存储了函数的存储单元的类型
函数用于把输入变成输出,因此,形参的个数、类型以及返回值类型确定了存储函数的存储单元的类型。
若函数有两个int型形参,返回值是int型,则指向此类函数的指针变量的定义为int (*pf)(int, int);。
第一个()先解释,*pf表示定义一个指针变量,类型为int (int, int),这个()表示函数,里面两个int,表示函数有两个int型形参,返回值为int型。
pf可以指向有2个int型形参,返回值为int型的函数。
函数用于把输入变成输出,因此,形参的个数、类型以及返回值类型确定了存储函数的存储单元的类型。
若函数有两个int型形参,返回值是int型,则指向此类函数的指针变量的定义为int (*pf)(int, int);。
第一个()先解释,*pf表示定义一个指针变量,类型为int (int, int),这个()表示函数,
里面两个int,表示函数有两个int型形参,返回值为int型。
pf可以指向有2个int型形参,返回值为int型的函数。
5
例9-21 使用指向函数的指针变量调用函数。
(*pf)(3)也可写成pf(3)
计算机中算一次乘法的时间比算一次加法的长,故将x*x-3*x+2改写x*(x-3)+2能节省计算时间。
指向函数的指针变量pf先是指向了自定义函数func,以(*pf)(3)方式调用函数求出了func(3)的值。
(*pf)(3)中的第1个()不能省略。*pf(3)中的pf会被理解为函数名。
pf又指向了库函数fabs,使用指向函数的指针变量调用函数时,也可以把指针变量作为函数名,直接调用。
6
思考题:例9-22 利用梯形法求f(x)的定积分的函数。
函数中有3个形参,一个函数f(x),另外两个是double型的a和b。
形参函数f(x)的类型为指向函数的指针变量。
定积分definite integral。
7
例9-22 利用梯形法求f(x)的定积分的函数。
利用定义的函数求了两个函数的定积分。正弦函数的实参需为以弧度表示的角度。
8
使用堆空间
这节课我们讨论堆空间。
9
9.8 使用堆区
内存可分为代码区和数据区。数据区又可分为静态存储区和动态存储区。动态存储区又可分为栈区和堆区。
全局变量的存储单元位于静态存储区。局部变量的存储单元位于栈区。
位于堆区的存储单元必须由程序员利用库函数显式地分配和释放。
如果位于堆区中的存储单元在使用完毕后没有显式地释放,这些存储单元就会一直为程序所拥有,直至程序运行结束。
内存可分为代码区和数据区。数据区又可分为静态存储区和动态存储区。动态存储区又可分为堆区和栈区。
全局变量的存储单元位于静态存储区。它们在程序运行之前分配,在程序运行期间始终为程序所有。
局部变量的存储单元位于栈区。它们在程序运行期间“遇到变量定义语句”时分配,超出变量作用域后释放。
位于堆区的存储单元必须由程序员利用库函数显式地分配和释放。
如果位于堆区中的存储单元在使用完毕后没有显式地释放,这些存储单元就会一直为程序所拥有,直至程序运行结束。
10
库函数malloc
库函数malloc用于在堆区中申请一块存储空间,它的形参是一个无符号整型,表明要申请的存储空间以字节为单位的长度。
如果存储空间分配成功,则malloc函数返回该存储空间的首字节地址,否则它将返回NULL。
函数调用malloc(16)申请了一个16字节的存储空间,其类型为void,即没有类型,返回值首字节地址的类型为void *。
库函数malloc在stdlib.h中声明。
库函数malloc用于在堆区中申请一块存储空间,它的形参是一个无符号整型,表明申请存