指针函数和函数指针的区别

C语言指针函数和函数指针详解

往往,我们一提到指针函数和函数指针的时候,就有很多人弄不懂。以下是为大家带来的C语言指针函数和函数指针详解,希望能帮助到大家!

一、指针函数

当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。

格式:

类型说明符 * 函数名(参数)

当然了,由于返回的是一个地址,所以类型说明符一般都是int。

例如:

int *GetDate();

int * aaa(int,int);

函数返回的是一个地址值,经常使用在返回数组的某一元素地址上。

int * GetDate(int wk,int dy);

main()

{

int wk,dy;

do

{

printf("Enter week(1-5)day(1-7) ");

scanf("%d%d",&wk,&dy);

}

while(wk<1||wk>5||dy<1||dy>7);

printf("%d ",*GetDate(wk,dy));

}

int * GetDate(int wk,int dy)

{

static int calendar[5][7]=

{

{1,2,3,4,5,6,7},

{8,9,10,11,12,13,14},

{15,16,17,18,19,20,21},

{22,23,24,25,26,27,28},

{29,30,31,-1}

};

return &calendar[wk-1][dy-1];

}

程序应该是很好理解的,子函数返回的是数组某元素的地址。输出的是这个地址里的值。

二、函数指针

指向函数的指针包含了函数的地址,可以通过它来调用函数。声明格式如下:

类型说明符 (*函数名)(参数)

其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数。指针的声明笔削和它指向函数的声明保持一致。

指针名和指针运算符外面的括号改变了默认的运算符优先级。如果没有圆括号,就变成了一个返回整型指针的函数的原型声明。

例如:

void (*fptr)();

把函数的地址赋值给函数指针,可以采用下面两种形式:

fptr=&Function;

fptr=Function;

取地址运算符&不是必需的,因为单单一个函数标识符就标号表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。

可以采用如下两种方式来通过指针调用函数:

x=(*fptr)();

x=fptr();

第二种格式看上去和函数调用无异。但是有些程序员倾向于使用第一种格式,因为它明确指出是通过指针而非函数名来调用函数的。下面举一个例子:

void (*funcp)();

void FileFunc(),EditFunc();

main()

{

funcp=FileFunc;

(*funcp)();

funcp=EditFunc;

(*funcp)();

}

void FileFunc()

{

printf("FileFunc ");

}

void EditFunc()

{

printf("EditFunc ");

}

程序输出为:

FileFunc

EditFunc

三、指针的指针

指针的指针看上去有些令人费解。它们的声明有两个星号。例如:

char ** cp;

如果有三个星号,那就是指针的指针的指针,四个星号就是指针的指针的指针的指针,依次类推。当你熟悉了简单的例子以后,就可以应付复杂的情况了。当然,实际程序中,一般也只用到二级指针,三个星号不常见,更别说四个星号了。

指针的指针需要用到指针的地址。

char c=A;

char *p=&c;

char **cp=&p;

通过指针的指针,不仅可以访问它指向的指针,还可以访问它指向的指针所指向的数据。下面就是几个这样的例子:

char *p1=*cp;

char c1=**cp;

你可能想知道这样的结构有什么用。利用指针的指针可以允许被调用函数修改局部指针变量和处理指针数组。

void FindCredit(int **);

main()

{

int vals[]={7,6,5,-4,3,2,1,0};

int *fp=vals;

FindCredit(&fp);

printf("%d ",*fp);

}

void FindCredit(int ** fpp)

{

while(**fpp!=0)

if(**fpp<0) break;

else (*fpp)++;

}

首先用一个数组的地址初始化指针fp,然后把该指针的地址作为实参传递给函数FindCredit()。FindCredit()函数通过表达式**fpp间接地得到数组中的数据。为遍历数组以找到一个负值,FindCredit()函数进行自增运算的对象是调用者的指向数组的`指针,而不是它自己的指向调用者指针的指针。语句(*fpp)++就是对形参指针指向的指针进行自增运算的。但是因为*运算符高于++运算符,所以圆括号在这里是必须的,如果没有圆括号,那么++运算符将作用于二重指针fpp上。

四、指向指针数组的指针

指针的指针另一用法旧处理指针数组。有些程序员喜欢用指针数组来代替多维数组,一个常见的用法就是处理字符串。

char *Names[]=

{

"Bill",

"Sam",

"Jim",

"Paul",

"Charles",

};

main()

{

char **nm=Names;

while(*nm!=0) printf("%s ",*nm++);

}

先用字符型指针数组Names的地址来初始化指针nm。每次printf()的调用都首先传递指针nm指向的字符型指针,然后对nm进行自增运算使其指向数组的下一个元素(还是指针)。注意完成上述认为的语法为*nm++,它首先取得指针指向的内容,然后使指针自增。

注意数组中的最后一个元素被初始化为0,while循环以次来判断是否到了数组末尾。具有零值的指针常常被用做循环数组的终止符。程序员称零值指针为空指针(NULL)。采用空指针作为终止符,在树种增删元素时,就不必改动遍历数组的代码,因为此时数组仍然以空指针作为结束。

指针函数和函数指针的区别

转载请注明出处记得学习 » 指针函数和函数指针的区别

学习

雪景的句子

阅读(129)

本文为您介绍雪景的句子,内容包括雪景的句子唯美短句,雪景的句子文案,雪景的句子一年级。雪景的句子无论是身处学校还是步入社会,大家都看到过许多经典的句子吧,从语气上分,句子可以分为陈述句、疑问句、祈使句和感叹句。那什么样的句子才

学习

甩掉烦恼作文

阅读(174)

本文为您介绍甩掉烦恼作文,内容包括甩掉烦恼作文400字,甩掉一切的烦恼重新开始,丢掉烦恼的作文。甩掉烦恼作文(精选22篇)在日复一日的学习、工作或生活中,大家对作文都再熟悉不过了吧,通过作文可以把我们那些零零散散的思想,聚集在一块。一篇

学习

夯实的近义词

阅读(349)

本文为您介绍夯实的近义词,内容包括夯实的近义词是什么,夯实的近义词和反义词,夯实基础近义词。夯实的近义词夯实为汉语词语,本意为加固,引申意义为打牢基础,多用于建筑行业。利用重物使其反复自由坠落对地基或填筑土石料进行夯击,以提高其

学习

护膝该如何选择

阅读(123)

本文为您介绍护膝该如何选择,内容包括怎样选择合适的护膝,护膝如何选择,保暖护膝怎么选择。护膝该如何选择导语:护膝不是万能的,没有护膝是万万不能的。膝盖是跑友们跑步活动中最重要的部位之一,同时又是一个比较脆弱容易受伤且恢复较慢的

学习

梦见大块肉是什么意思

阅读(108)

本文为您介绍梦见大块肉是什么意思,内容包括梦见大块肉是什么意思周公解梦,梦见大块肉是什么预兆,梦见大块肉。梦见大块肉是什么意思梦见大块猪肉是什么意思?梦见大块猪肉好不好,代表着什么?很多人都有这方面的解梦疑惑,下面是整理的梦见

学习

谨小慎微造句

阅读(96)

本文为您介绍谨小慎微造句,内容包括谨小慎微造句及意思,谨小慎微怎么造句,谨小慎微造短句子。谨小慎微造句造句是初等学校语文练习内容、考试题型、作业方式等之一。下面是收集整理的谨小慎微造句,希望能够帮助到大家。词语解释:过分小心

学习

肆无忌惮的反义词

阅读(161)

本文为您介绍肆无忌惮的反义词,内容包括肆无忌惮的反义词是什么,肆无忌惮反义词,忌惮的反义词。肆无忌惮的反义词肆无忌惮,汉语成语,拼音为sìwújìdàn,指恣意妄行,毫无顾忌。出自《礼记·中庸》。下面是给大家带来肆无忌惮的反义词,希望对

学习

殡仪馆内的常识禁忌

阅读(200)

本文为您介绍殡仪馆内的常识禁忌,内容包括去殡仪馆后回家的禁忌,殡仪馆出来后的禁忌,从殡仪馆回来的禁忌。殡仪馆内的常识禁忌一般而言,人有三魂,分别为生魂、灵魂及觉魂,生魂举凡动、植物都有,它是一直有在成长,是看得见的;灵魂是看不见的,胎

学习

雀巢淡奶油打发教程

阅读(145)

本文为您介绍雀巢淡奶油打发教程,内容包括雀巢淡奶油打发不起来,雀巢淡奶油打发,雀巢淡奶油打发前放冰箱几个小时。雀巢淡奶油打发导语:有人感觉雀巢淡奶油不好打发,主要原因就是这种奶油的含量接近打发标准的临界点,所以打发的时候需要掌

学习

僻静的反义词

阅读(94)

本文为您介绍僻静的反义词,内容包括僻静的反义词是什么,僻静的反义词标准答案,勤勉的反义词。僻静的反义词反义词就是两个意思相反的词,包括:绝对反义词和相对反义词。下面是给大家带来的僻静的反义词,大家来看下吧!中文发音:僻静[pìjìng]词

学习

消防中控室年终总结

阅读(153)

本文为您介绍消防中控室年终总结,内容包括消防中控室年终总结怎么写,消防中控室年终总结,物业消防中控室个人年终总结。消防中控室年终总结时光匆匆,我们在忙碌中奔走,不经意间我们又到了岁末年终,在这一年中有什么得失吗,有什么值得分享的

学习

春节快递会派送吗

阅读(97)

本文为您介绍春节快递会派送吗,内容包括春节快递会派送吗圆通,春节快递能正常派送吗,快递春节什么时候恢复派送。春节快递会派送吗春节快递会派送吗,目前中通、韵达、德邦三大快递公司已经明确“春节不打烊”,为年货等货物顺畅流通提供快

学习

交友不慎的伤感句子

阅读(95)

本文为您介绍交友不慎的伤感句子,内容包括交友不慎发朋友圈的句子,交友不慎心寒的句子,形容交友不慎的经典句子。交友不慎的伤感句子朋友间保持一定的距离,而使友谊永存。以下是为大家整理的交友不慎的伤感句子,希望给大家带来帮助!感谢阅

学习

依靠谁都不如靠自己的句子

阅读(128)

本文为您介绍依靠谁都不如靠自己的句子,内容包括依靠谁都不如靠自己,靠谁不如靠自己句子,靠谁都不如靠自己的句子发朋友圈。依靠谁都不如靠自己的句子在学习、工作、生活中,许多人都接触过一些比较经典的句子吧,根据句子的语气用途不同,句

学习

中班语言瓜瓜吃瓜公开课

阅读(97)

本文为您介绍中班语言瓜瓜吃瓜公开课,内容包括幼儿园中班语言教案《瓜瓜吃瓜》,中班手指游戏瓜瓜花教案,瓜瓜吃瓜教案。幼儿园中班语言教案《瓜瓜吃瓜》在教学工作者开展教学活动前,通常需要用到教案来辅助教学,教案是实施教学的主要依据,

学习

鼠标指针移动停顿是什么原因

阅读(131)

本文为您介绍鼠标指针移动停顿是什么原因,内容包括解决鼠标指针移动时出现停顿卡的原因,鼠标指针移动卡顿怎么解决,鼠标指针会有间歇停顿。解决鼠标指针移动时出现停顿卡的原因通常,鼠标发生停顿是鼠标的灵敏度变差,灵敏度变差是光电鼠标

学习

c语言指针是什么意思

阅读(122)

本文为您介绍c语言指针是什么意思,内容包括C语言的指针类型详解,c语言指针类型总结,c语言中指针如何使用。C语言的指针类型详解C语言的指针类型包括两方面的信息:一是地址,存放在指针变量中;二是类型信息,关乎于读写的长度,没有存储在指针变

学习

指针的各种意思

阅读(97)

本文为您介绍指针的各种意思,内容包括指针的解释及造句,指针的名词解释是什么,指针的造句大全。指针的解释及造句造句指懂得并使用字词,按照一定的句法规则造出字词通顺、意思完整、符合逻辑的句子。依据现代语文学科特征,可延伸为写段、

学习

小班语言教案小草青青故事

阅读(116)

本文为您介绍小班语言教案小草青青故事,内容包括小草青青教案(精选),小草青青科学教案,小草青青幼儿园教案反思。小草青青教案(精选7篇)作为一位优秀的人民教师,时常要开展教案准备工作,教案有助于顺利而有效地开展教学活动。教案要怎么写呢?以

学习

小班语言啪啦啪啦砰的反思

阅读(108)

本文为您介绍小班语言啪啦啪啦砰的反思,内容包括啪啦啪啦——砰中班语言活动教案,中班噼里啪啦教案,中班语言吧嗒吧嗒教案。啪啦啪啦——砰中班语言活动教案作为一名默默奉献的教育工作者,通常需要用到教案来辅助教学,教案有助于学生理解

学习

啪啦啪啦嘭中班语言教案和评语

阅读(214)

本文为您介绍啪啦啪啦嘭中班语言教案和评语,内容包括中班语言优质教案《啪啦啪啦——砰》(精选),中班语言活动啪啦啪啦嘭课件,中班语言活动啪啦啪啦砰绘本反思。中班语言优质教案《啪啦啪啦——砰》(精选12篇)作为一名人民教师,常常要根据教

学习

中班语言活动啪啦啪啦教案

阅读(125)

本文为您介绍中班语言活动啪啦啪啦教案,内容包括啪啦啪啦——砰中班语言活动教案,啪啦啪啦砰教案,啪啦啪啦砰教案反思。啪啦啪啦——砰中班语言活动教案作为一名默默奉献的教育工作者,通常需要用到教案来辅助教学,教案有助于学生理解并掌