彻底搞定C语言指针 第七篇

函数名与函数指针

一 数调用

一个通常的函数调用的例子:

//自行包含 头文件
void MyFun(int x);    //此处的申明也可写成:void MyFun( int );
int main(int argc, char* argv[])
{
MyFun(10);     //这里是调用MyFun(10);函数
return 0;
}
void MyFun(int x)  //这里定义一个MyFun函数
{
printf ("%d\n",x);
}

这个MyFun函数是一个无返回值的函数,它并不完成什 么事情。这种调用函数的格式你应该是很熟悉的吧!看主函数中调用MyFun函数的书写格式:

MyFun(10);

我们一开始只是从功能上或者说从数学意义上理解MyFun这个函数,知道 MyFun函数名代表的是一个功能(或是说一段代码)。

直到——

学习到函数指 针概念时。我才不得不在思考:函数名到底又是什么东西呢?

(不要以为这是没有什么意义的事 噢!呵呵,继续往下看你就知道了。)

二 函数指针变量的申明

就象某一数据变量的内存 地址可以存储在相应的指针变量中一样,函数的首地址也以存储在某个函数指针变量里的。这样,我就 可以通过这个函数指针变量来调用所指向的函数了。

在C系列语言中,任何一个变量,总是要先 申明,之后才能使用的。那么,函数指针变量也应该要先申明吧?那又是如何来申明呢?以上面的例子 为例,我来申明一个可以指向MyFun函数的函数指针变量FunP.下面就是申明FunP变量的方法:

void (*FunP)(int) ;   //也可写成void (*FunP)(int x);

你看,整个函 数指针变量的申明格式如同函数MyFun的申明处一样,只不过——我们把MyFun改成(*FunP) 而已,这样就有了一个能指向MyFun函数的指针FunP了。(当然,这个FunP指针变量也可以指向所有其它 具有相同参数及返回值的函数了。)

三 通过函数指针变量调用函数

有了FunP指针变量后 ,我们就可以对它赋值指向MyFun,然后通过FunP来调用MyFun函数了。看我如何通过FunP指针变量来调 用MyFun函数的:

//自行包含头文件
void MyFun(int x);    //这个申明也可写 成:void MyFun( int );
void (*FunP)(int );   //也可申明成void(*FunP)(int x),但习惯 上一般不这样。
int main(int argc, char* argv[])
{
MyFun(10);     //这是 直接调用MyFun函数
FunP=&MyFun;  //将MyFun函数的地址赋给FunP变量
(*FunP)(20);     //这是通过函数指针变量FunP来调用MyFun函数的。
}
void MyFun(int x)  //这里 定义一个MyFun函数
{
printf("%d\n",x);
}

请看黑体字部 分的代码及注释。

运行看看。嗯,不错,程序运行得很好。

哦,我的感觉是:MyFun与 FunP的类型关系类似于int 与int *的关系。函数MyFun好像是一个如int的变量(或常量),而FunP则像 一个如int *一样的指针变量。

int i,*pi;

pi=&i;    //与FunP=&MyFun 比较。

(你的感觉呢?)

呵呵,其实不然——

四 调用函数的其它书 写格式

函数指针也可如下使用,来完成同样的事情:

//自行包含头文件
void MyFun(int x);
void (*FunP)(int );    //申明一个用以指向同样参数,返回值函数 的指针变量。
int main(int argc, char* argv[])
{
MyFun(10);     //这里是 调用MyFun(10);函数
FunP=MyFun;  //将MyFun函数的地址赋给FunP变量
FunP(20);    //这是通过函数指针变量来调用MyFun函数的。
return 0;
}
void MyFun(int x)  // 这里定义一个MyFun函数
{
printf("%d\n",x);
}

我改了黑 体字部分(请自行与之前的代码比较一下)。

运行试试,啊!一样地成功。

咦?

FunP=MyFun;

可以这样将MyFun值同赋值给FunP,难道MyFun与FunP是同一数据类型(即 如同的int 与int的关系),而不是如同int 与int*的关系了?(有没有一点点的糊涂了?)

看 来与之前的代码有点矛盾了,是吧!所以我说嘛!

请容许我暂不给你解释,继续看以下几种情况 (这些可都是可以正确运行的代码哟!):

时间: 2024-10-22 00:02:56

彻底搞定C语言指针 第七篇的相关文章

彻底搞定C语言指针 第四篇

1 int i 说起 你知道我们申明一个变量时象这样int i :这个i是可能在它处重新变赋值的. 如下: int i=0: //- i=20://这里重新赋值了 不过有一天我的程 序可能需要这样一个变量(暂且称它变量),在申明时就赋一个初始值.之后我的程序在其它任何处都 不会再去重新对它赋值.那我又应该怎么办呢?用const . //************** const int ic =20: //- ic=40://这样是不可以的,编译时是无法通过,因为我们不能对 const 修饰的ic

彻底搞定C语言指针 第五篇

一.三道考题 开讲之前,我先请你做三道题目.(嘿嘿,得先把你的头脑搞昏才行 --唉呀,谁扔我鸡蛋?) 1.考题一:程序代码如下: void Exchg1(int x, int y) { int tmp; tmp=x; x=y; y=tmp; printf ("x=%d,y=%d\n",x,y) } void main() { int a=4,b=6; Exchg1 (a,b) ; printf("a=%d,b=%d\n",a,b) } 输出的结果 : x=____,

彻底搞定C语言指针 第六篇

指向另一指针的指针 一.针概念: 早在本系列第二篇中我就对指针的实质进行了阐述 .今天我们又要学习一个叫做指向另一指针地址的指针.让我们先回顾一下指针的概念吧! 当我 们程序如下申明变量: short int i: char a: short int * pi: 程序会 在内存某地址空间上为各变量开辟空间,如下图所示. 内存地址→6 7 8 9 10 11 12 13 14 15 ------------------- --------------------------------------

彻底搞定C语言指针 第三篇

1.数组元素 看下面代码 int i,a[]={3,4,5,6,7,3,7,4,4,6}; for (i=0;i<=9;i++) { printf ( "%d", a[i] ); } 很显然,它是显示a 数组的各元素值. 我们还可以这样访问元素,如下 int i,a[]={3,4,5,6,7,3,7,4,4,6}; for (i=0;i<=9;i++) { printf ( "%d", *(a+i) ); } 它的结果和作用完全一样 2. 通过指针访问数

彻底搞定C语言指针 第一篇

1.语言中变量的实质 要理解C指针,我认为一定要理解C中"变量"的存储实质, 所以我就从"变量"这个东西开始讲起吧! 先来理解理解内存空间吧!请看下图: 内存地址→ 6 7 8 9 10 11 12 13 ----------------------------------------------------------------- ... | | | | | | | |.. ------------------------------- ------------

彻底搞定C语言指针 第二篇

二.指针是什么东西 想说弄懂你不容易啊!我们许多初学指针的人都要这样的感慨.我常常在思索它,为什么呢?其实生活中处处都有指针.我们也处处在使用它.有了它我们的生活才更加方便 了.没有指针,那生活才不方便.不信?你看下面的例子. 这是一个生活中的例子:比如说你要 我借给你一本书,我到了你宿舍,但是你人不在宿舍,于是我把书放在你的2层3号的书架上,并写了一 张纸条放在你的桌上.纸条上写着:你要的书在第2层3号的书架上.当你回来时,看到这张纸条.你就 知道了我借与你的书放在哪了.你想想看,这张纸条的作

开发unity插件——一次搞定unity编辑器常用功能

开发unity插件--一次搞定unity编辑器常用功能 这篇文章主要分享unity中与editor插件等相关的使用,比较基础,不过如果都掌握了就可以扩展写一些unity插件了,平时开发中也会提升工作效率. editor相关脚本一定要放在Editor文件夹下,继承monobehaviour的文件不要放到Editor文件夹下. monobehaviour相关的编辑器功能 首先常用的在继承monobehaviour类中写public变量可以在inspector中序列化可编辑一般人都知道了,下面是一些可

win7语言栏不见了怎么办?简单两步搞定

win7语言栏不见了怎么办?很多网友遇到这种问题都急得像热锅上的蚂蚁,其实解决方法很容易,只需简单几步就可以搞定啦. 操作步骤如下: 1. 依次单击"开始"--"控制面板"--"更改键盘或其它输入法"--"更改键盘"; 2. 打开"语言栏"选项卡,点击选中"停靠于任务栏"后按"确定"退出.         注:更多精彩教程请关注三联windows7教程栏目,三联电脑办

【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】下 ~ Net程序员的福利

上一节我们通过通用封装说了下QQ登录的申请和通用讲解,[开源]简单4步搞定QQ登录,无需什么代码功底[无语言界限]:http://www.cnblogs.com/dunitian/p/5055789.html 这次我们专门为Net程序员准备一个专版(其他方向的看通用封装即可,使用起来很简单) 做个简单的案例:(EF+MVC) 1.先看一下自己的appid 2.前台一系列设置:(图片看不见的话点开看,会放大的) 3.数据库设计(简单版本) 4.Model类 5.后台处理(不同框架处理不一样,这边给