指向结构体变量的指针变量叫结构体类型指针变量,其定义方式、使用方法与指向基本变量的方法相同。使用结构体指针变量时还需要特别注意,结构体变量的地址与结构体变量成员的地址是不同的。已知某学生3门课程的成绩存放在一个结构体变量中,请设计一个独立的函数计算该学生的平均成绩,要求函数使用结构体指针变量做函数的形式参数。......
2023-11-20
一个函数在编译时,会被编译器分配一个地址,用函数名来表示,这个地址就称为该函数的指针。可以用一个指针变量指向一个函数,然后通过该指针变量调用此函数。
假设有一个函数func,则其内存映射方式如图8.1所示。
图8.1 函数内存映射方式
1.指向函数指针变量的定义
C语言中可以定义指针变量来存储函数的首地址,并利用该指针变量对函数进行调用。由于函数本身具有返回值类型、参数表等特征,所以在定义指向函数指针变量的时候必须表达出这些特征。指向函数指针变量定义的一般形式:
[存储类别符]数据类型名(*指针变量名)([形参类型1,形参类型2,…,形参类型n])
其中,存储类别符是函数指针变量本身的存储特性;数据类型则是被指针变量所指向的函数返回值类型,形参类型是指函数指针所指向的函数的形式参数数据,如果被指向函数有形参,则定义时带上形参类型;如果被指向函数没有形参,则定义也没有。
例如,设一函数的原型为:
void swap(int x,int y);
如果需要定义指向函数swap的指针变量,形式应该是:
void(*fp)(int x,int y);
对照上面swap函数的原型和指向函数的指针变量fp可以看出,在定义指向函数的指针变量时,指针变量名可以根据需要命名,但指针变量的数据类型和所带的参数表则与被指向的函数对应一致。
需要指出的是,定义指向函数的指针变量后,该指针变量不仅仅能指向某一个函数,而是可以指具有相同返回值类型和形参表的任意函数。例如,对于上面根据函数swap定义的指针变量fp而言,不仅能够指向函数swap,所有与swap返回值类型、参数表相同的函数都能够被该指针变量指向。
2.指向函数指针变量的赋值和引用
定义指向函数的指针变量后,就可以对其进行赋值。对指向函数的指针变量赋值,就是用被指向函数的名字对其赋值,其赋值的一般格式为:
函数指针=[&]函数名;其中,函数名后不能带括号和参数;函数名前的“&”符号是可选的。例如,对于前面定义的指针变量fp,可以将函数swap的名字直接赋值给该指针变量。赋值的形式为:
fp=swap; //也可以使用fp=&swap;当一个指向函数的指针变量指向了一个函数后,通过对指针变量实施取指针运算就可以表示被指向的函数。利用函数指针来调用函数可以采用下面两种格式之一:
函数指针变量([实参1,实参2,…,实参n]);
(*函数指针变量)([实参1,实参2,…,实参n]);
例如,若指针变量fp已经指向了函数swap,那么swap函数的调用方法有:(www.chuimin.cn)
swap(10,20)//用函数名调用swap函数
(*fp)(10,20)//用指向swap函数的指针fp调用swap函数
fp(10,20)//用指向swap函数的指针变量调用swap函数
【例8.3】 指向函数的指针变量使用示例(求a+|b|)。
上面程序中,根据变量b的值来确定指针变量dp是指向函数add1还是指向函数add2,然后通过指针变量来调用对应的函数。这个示例是为了说明指向函数的指针变量如何赋值以及如何使用指向函数的指针变量来调用函数。指向函数的指针变量的真正作用是作为函数参数使用,使程序在功能的实现上具有更大的灵活性。
3.指向函数指针变量作函数的形式参数
当存在多个函数,它们的功能不同,但参数列表和返回值相同时,为了提高程序的运行效率,可以采用函数指针。这种情况下,函数指针通常作为函数的参数。
【例8.4】 指向函数的指针变量求最大值、最小值和两数之和。
【例8.5】 用函数指针数组来实现对一系列同类函数的调用。
程序一次运行的过程和结果如下:
有关C语言程序设计基础(第3版)的文章
指向结构体变量的指针变量叫结构体类型指针变量,其定义方式、使用方法与指向基本变量的方法相同。使用结构体指针变量时还需要特别注意,结构体变量的地址与结构体变量成员的地址是不同的。已知某学生3门课程的成绩存放在一个结构体变量中,请设计一个独立的函数计算该学生的平均成绩,要求函数使用结构体指针变量做函数的形式参数。......
2023-11-20
在C语言中,二维数组是由一维数组作元素的一维数组。当需要用指针指向二维数组时,可以采用一级指针变量和二级指针变量两种处理形式。表8.3指向若干元素构成的一维数组指针变量表示二维数组元素使用指向由若干个元素组成的一维数组的指针处理二维数组。......
2023-11-20
图8.3用指针修改数组元素的值使用指针变量表示数组元素示例。另外,在输出数组值的操作中,首先让指针变量p指向数组0号元素,然后通过循环控制中的p++运算,使得指针变量p依次指向a数组的其他元素,通过*p的方式表达数组元素值。程序执行的结果为:0010000如果有两个指针变量分别指向同一个数组的两个不同元素,则两个指针变量之间的距离表示了它们之间的差距有多少个数组元素。......
2023-11-20
取内容运算符*,又称间接引用运算符,结合性自右而左,用来表示指针变量所指的变量。指针变量定义时,“*”仅表示其后的变量是指针类型变量。图6.5指针的算术操作若设指针变量p 的值为2000,对于整型数据,其长度是2 个字节。然后,通过指针变量升序输出。图6.7指针变量p1 和p2 交换前后的指针方向......
2023-10-21
系统标准库中有许多返回指针值的函数,如字符串处理、存储分配等标准库函数。返回指针值的函数的调用与普通函数的参数传递相同,所不同的是需要定义一个与其返回值数据类型相同的指针变量来接收返回值。求,要求使用静态局部变量和返回指针的函数方式进行处理。返回指针值函数设计最重要的一点是其返回值(指针),总体原则是:返回的指针所对应的内存空间不能因该指针函数的返回而被释放掉。......
2023-11-20
图5.7两层函数嵌套调用示意图函数的嵌套调用即一个函数在被调用的过程中又调用了另外的一个函数。函数fac和powers的返回值类型均被设计为double型,其主要目的是为了避免n!x:0.5//0.5从键盘输入的数据0.50 powers of e=1.648721//程序执行结果......
2023-11-20
void类型指针中的数据不能访问,如果非要访问的话,可以通过强制转换将void类型指针转换为与所指向的数据类型相符的类型。所谓“相同存储对齐限制”是指void类型指针所指的数据在内存中所占的长度与显式转换后的指针所指的数据在内存中所占的长度相等。同理,如果是将void类型转换为具有更小存储对齐限制的指针时,也可能引起数值的改变。......
2023-11-18
例如,有如下所示的C语句序列:则结构体指针变量p1指向结构体数组元素a[2],其关系如图10.2所示。此时应该注意到被指针变量p1指向的结构体数组元素本身是不能作为整体操作的,所以*p1也不能作为整体操作。......
2023-11-20
相关推荐