A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ⒈心只霸占沵 高级黑马   /  2014-5-14 20:51  /  1646 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ⒈心只霸占沵 于 2014-5-16 15:57 编辑

指针类型
指向变量我明白
指向数组我也明白
指向函数有问题
比如说
    p指向一个函数 ,p的值是这个函数在内存中的地址,那么*p代表的是什么啊?我知道如果是变量的话,p存的是地址,*p指的是地址指向的那块内存,可就是指向函数的指针p和*p区分不开,哪位大神帮忙解释解释,非常感谢

评分

参与人数 1技术分 +1 收起 理由
wanzhu159 + 1 恩,这个是重点,对学ios很重要,ios里面后.

查看全部评分

5 个回复

倒序浏览
一个函数在编译时被分配一个入口地址。这个入口地址就称为函数指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main()
  4. {
  5.     int max(int,int);
  6.     int (*p)(int,int);
  7.     int a,b,c;
  8.     p = max;
  9.     scanf("%d,%d",&a,&b);
  10.     c = (*p)(a,b);
  11.     printf("a=%d,b=%d,max=%d\n",a,b,c);
  12.     return 0;
  13. }

  14. int max(int x,int y)
  15. {
  16.     int z;
  17.     if(x>y) z = x;
  18.     else z = y;
  19.     return(z);
  20. }
复制代码

 main函数中的" c = max(a,b); " 包括了一次函数的调用。每一个函数都占用一段内存单元。因此,可以用一个指针变量指向一个函数,通过指针变量来访问它指向的函数。

  第7行:int (*p)( int,int );  用来定义 p 是一个指向函数的指针变量,该函数有两个整形参数,函数值为整形。注意 *p 两侧的括号不可省略,表示 p 先与 * 结合,是指针变量,然后再与后面的 ( ) 结合,表示此指针变量指向函数,这个函数值 (即函数的返回值) 是整形的。如果写成 int *p ( int,int ) ,由于( )的优先级高于 *,它就成了声明一个函数P( 这个函数的返回值是指向整形变量的指针)。

  赋值语句 p = max ; 作用是将函数 max 的入口地址赋给指针变量p。和数组名代表数组首元素地址类似,函数名代表该函数的入口地址。这时 p 就是指向函数 max 的指针变量,此时 p 和 max都指向函数开头,调用 *p 就是调用 max 函数。但是p作为指向函数的指针变量,它只能指向函数入口处而不可能指向函数中间的某一处指令处,因此不能用 *(p + 1)来表示指向下一条指令。

  注意:

  (1) 指向函数的指针变量的一般定义形式为:

  数据类型 (*指针变量名)(函数参数列表)

  这里数据类型就是函数返回值的类型

  (2) int (* p) ( int,int ); 它只是定义一个指向函数的指针变量 p, 它不是固定指向哪一个函数的,而只是表示定义这样一个类型的变量,它是专门用来存放函数的入口地址的。在程序中把哪一函数(该函数的值应该是整形的,且有两个整形参数)的地址赋给它,他就指向哪一个函数。在一个函数中,一个函数指针变量可以先后指向同类型的不同函数。

  (3) p = max; 在给函数指针变量赋值时,只需给出函数名而不必给出函数参数,因为是将函数的入口地址赋给 p ,而不涉及 实参和形参的结合问题,不能写成 p = max(a,b);

  (4) c = (*p)(a,b) 在函数调用时,只需将( *p ) 代替函数名即可,后面实参依旧。

  (5) 对于指向函数的指针变量,像 p++ ,p+n.....是无意义的。

评分

参与人数 1技术分 +1 收起 理由
ios风痕 + 1

查看全部评分

回复 使用道具 举报
对指针完全晕了。。。
回复 使用道具 举报
指针就是指向一个内存地址,而函数就是一个地址而已,他的代码就是一个执行块而已,没什么难理解的,
指针就是一个地址而已,32程序的指针是4个字节,64位程序是8个字节,不懂的可以私聊我,我会给你详细的解答。

评分

参与人数 1技术分 +1 收起 理由
ios风痕 + 1

查看全部评分

回复 使用道具 举报
奇迹 发表于 2014-5-15 13:09
指针就是指向一个内存地址,而函数就是一个地址而已,他的代码就是一个执行块而已,没什么难理解的,
指针 ...

搞明白了,谢谢你!
回复 使用道具 举报
无尽可能 发表于 2014-5-14 21:32
一个函数在编译时被分配一个入口地址。这个入口地址就称为函数指针。可以用一个指针变量指向函数,然后通过 ...

明白了,谢谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马