云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 第十章 指针

第十章 指针

  • 62 次阅读
  • 3 次下载
  • 2025/6/15 4:09:54

#include

main(int argc,char *argv[]) {

while(argc-- >1)

printf(\}

程序经编译、连接生成可执行文件display.exe后,在DOS环境下输入如上所述的命令行,运行结果如下:

C

Visual-C++ Database

10.6函数和指针

C语言的函数被装入内存时,其代码占用一段连续的内存区,函数名就代表该内存区域的首地址,称为入口地址。

我们可以把函数的入口地址赋予一个指针变量,该指针变量就指向函数。通过指针变量可以找到并调用这个函数。这种指向函数的指针变量称为“函数指针变量”,简称“函数指针”。

函数指针定义的一般形式为: 类型标识符 (*指针变量名)()

其中“类型标识符”表示被指函数的返回值的类型。“(* 指针变量名)”表示*后面的变量是定义的指针变量,用括号括起来表示指针变量所指的是一个函数,因为括号的优先级比指向运算符高,否则就变成了“返回指针值的函数”。

如:

int (*pf)();

定义一个指向整型函数的指针变量pf。

函数指针变量不能进行算术运算,这是与指向数组元素的指针变量不同的。后者加减一个整数可使指针向后或向前移动,以指向后面或前面的数组元素;而函数指针变量的移动既毫无意义,又是C语言的语法所不允许的。

10.6.1 用函数指针变量调用函数

当函数指针变量指向某函数时,可通过它调用相应的函数。调用的一般形式为:

(*函数指针变量名)(实参表) 或 函数指针变量名(实参表)

使用函数指针变量应注意,使用第一种形式调用函数时,“(*函数指针变量名)”的两边的括号不可少,其中的*不应该理解为求值运算,在此处它只是一种表示符号。

第一种方法更直观,因为从形式上反映出了它是一个指向函数的指针,函数的调用是通

221

过间接引用这个指针实现的。第二种方法让人看起来就象一个实际的函数,有些用户可能想看函数的定义,但在文件中永远也找不到,这可能会使他们大惑不解。

在用函数指针变量调用函数时,要把被调用函数的入口地址赋给它。为函数指针变量赋值的一般形式为:

函数指针变量名=函数名;

例10.23 用函数指针变量实现对函数的调用。 #include main() {

int max(int a,int b);

int (*pf)(); /* 定义pf为指向整型函数的指针变量*/ int x,y,z;

pf=max; /* pf指向max函数*/ printf(\ scanf(\

z=(*pf)(x,y); /* 用函数指针形式调用函数*/ printf(\}

int max(int a,int b) {

if(a>b) return a; else return b; }

程序运行结果为:

input two numbers:45 62↙ maxmum=62

用函数指针变量调用函数,好象是多此一举。实际上,当我们需要根据程序执行的不同情况调用不同的函数时,这种方式非常方便。函数指针常用在菜单系统中。程序提示用户从菜单中选择一个选项,每个选项都调用一个不同的函数来完成其功能。我们可以将指向每一个函数的指针存储在一个指向函数的指针数组中,这样可以将用户的选择作为数组的下标,通过使用数组中的函数指针来调用函数。 10.6.2 用指向函数的指针作函数参数

如果程序中某个函数要调用其他的函数,而每次调用的函数需要随着不同的情况变化,利用指向函数的指针作为函数的参数就方便多了,只要调用时给出相应的函数名作为实参指明被调用函数,而不必对调用函数作任何修改。

例10.24 编程实现排序程序使其能够根据情况选择是以升序还是降序方式对数组排序。 对数组升序还是降序排列主要在于比较方式。因此,我们只需将函数的比较部分独立出来,另外编写两个比较函数ascending()和descending(),然后,在传统的排序法中通过函数指针调用这两者之一,就可实现升序或降序排序。程序如下:

222

#include #define SIZE 10

void bubble(int *,int,int (*)()); int ascending(int,int); int descending(int,int); main() {

int a[SIZE]={2,6,4,8,10,12,89,68,45,37}; int counter,order,(*sort)(int,int);

printf(\ for(counter=0;counter

printf(\(ascending)or 2 (descending):\ scanf(\ if(order==1) {

sort=ascending;

printf(\ } else {

sort=descending;

printf(\ }

bubble(a,SIZE,sort);

for(counter=0;counter

void bubble(int *work,int size,int (*compare)(int, int)) {

int pass,count;

void swap(int *,int *);

for(pass=1;pass

for(count=0;count

if((*compare)(work[count],work[count+1])) swap( &work[count],&work[count+1]); }

void swap(int *element1Ptr,int *element2Ptr)

223

{

int temp=*element1Ptr;

*element1Ptr=*element2Ptr; *element2Ptr=temp; }

int ascending(int a,int b) {

return b

int descending(int a,int b) {

return b>a; }

运行程序,选升序排序,结果如下: Data items in original order

2 6 4 8 10 12 89 68 45 37 Enter 1 (ascending) or 2 (descending ):1↙ Data items in ascending order

2 4 6 8 10 12 37 45 68 89 再次运行,选降序排序,结果如下: Data items in original order

2 6 4 8 10 12 89 68 45 37 Enter 1 (ascending) or 2 (descending):2↙ Data items in descending order

89 68 45 37 12 10 8 6 4 2

函数bubble的头部出现了如下的参数:int (*compare)(int,int)。这个参数说明bubble要求以指向函数的指针作为参数,指针所指向的函数要带两个整型参数,并且返回值是一个整数。因为*的优先级比用于函数的圆括号优先级低,所以用于*compare的圆括号是必需的。

传递给bubble函数的函数指针的使用方式为(*compare)(work[count], work[count+1]),就象通过引用指向变量的指针来访问变量值一样,间接引用指向函数的指针可使用这个函数。采用第二种函数指针调用形式也能调用这个函数,如:compare(work[count], work[count+1])。

224

搜索更多关于: 第十章 指针 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

#include main(int argc,char *argv[]) { while(argc-- >1) printf(\} 程序经编译、连接生成可执行文件display.exe后,在DOS环境下输入如上所述的命令行,运行结果如下: C Visual-C++ Database 10.6函数和指针 C语言的函数被装入内存时,其代码占用一段连续的内存区,函数名就代表该内存区域的首地址,称为入口地址。 我们可以把函数的入口地址赋予一个指针变量,该指针变量就指向函数。通过指针变量可以找到并调用这个函数。这种指向函数的指针变量称为“函数指针变量”,简称“函数指针”。 函数指针定义的一般形式为: 类型标识符 (*指针

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com