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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 悟中生有 中级黑马   /  2014-4-4 15:49  /  1832 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 悟中生有 于 2014-4-4 16:35 编辑
  1. #include <stdio.h>

  2. // 定义一个sum函数,计算a跟b的和
  3. int sum(int a, int b) {
  4.     int c = a + b;
  5.     printf("%d + %d = %d\n", a, b, c);
  6.     return c;
  7. }
  8. //给指向函数的指针起别名
  9. typedef int (*MySum)(int, int);

  10. int main() {
  11.     // 定义一个指向sum函数的指针变量p
  12.     MySum p = sum;
  13.    
  14.     // 利用指针变量p调用sum函数
  15.     (*p)(4, 5);
  16.    
  17.     return 0;
  18. }
复制代码
其中://给指向函数的指针起别名
typedef int (*MySum)(int, int);  这一句怎么理解?原名是什么? 别名是什么?

求高手指教!谢谢!

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

13 个回复

倒序浏览
MySum 就是别名;
原名这个词只是便于理解,其实意思就是定义一个类型名称,这个类型就是int (*)(int, int)这种函数类型的指针,
所以原名你可以理解为int (*)(int, int)
MySum p = sum;
等效
int (*p)(int, int) = sum;

个人理解,仅供参考。。。。

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 zjw66485542 于 2014-4-4 16:24 编辑

这样 你定义了一个sum函数来求和

  1. <LI>int sum(int a, int b) {

  2. <LI>    int c = a + b;

  3. <LI>    printf("%d + %d = %d\n", a, b, c);

  4. <LI>    return c</LI>
复制代码
你如果想要定义一个指向函数的指针不用typedf就是:
  1. int (*p)(int,int)=sum;//这样就指过去了
复制代码
你代码中的
typedef int (*MySum)(int, int);  这里就是typedef就是定义一个新类型,是MySum类型,并且定义了你的这个MySum类型是指向一个函数的
也就是说你定义的这个MySum类型以后可以定义指向函数指针这种变量

MySum p=sum;//就是定义了一个能指向函数的指针变量P

这么说你明白么?

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
脸皮猴 发表于 2014-4-4 16:20
MySum 就是别名;
原名这个词只是便于理解,其实意思就是定义一个类型名称,这个类型就是int (*)(int, int) ...

可不可以理解为是typedef针对指向函数的指针的特殊写法,,,?
正常的是这样:
格式:typedef 旧名字 新名字;  ---> typedef  int  Integer;
回复 使用道具 举报
本帖最后由 悟中生有 于 2014-4-4 16:30 编辑
zjw66485542 发表于 2014-4-4 16:23
这样 你定义了一个sum函数来求和
你如果想要定义一个指向函数的指针不用typedf就是:
你代码中的

这里我想弄明白typedef是怎么对指向函数的指针进行操作的。谢谢你!
回复 使用道具 举报
本帖最后由 董月峰 于 2014-4-4 16:43 编辑

其中://给指向函数的指针起别名
typedef int (*MySum)(int, int);  这一句怎么理解?原名是什么? 别名是什么?

首先typedef是为现有的类型【本题中就是指针】创建一个新的名字【楼主不懂可以看下c语言基础视频07-其它的05和06】
这句话的理解就是创建一个新的名字MySum来表示指向函数的指针
原名是:指针(这里应该是int *(int,int))
别名(新的名字):MySum
也就是可以在后面的代码中用  MySum  来代替 int *(int,int)------------分割线----------下列内容摘抄自百度百科------------------------
编程实践中,尤其是看别人代码的时候,常常会遇到比较复杂的变量声明,使用typedef作简化自有其价值,比如:
下面是三个变量的声明,我想使用typdef分别给它们定义一个别名,请问该如何做?
>1:int *(*a[5])(int, char*);
>2:void (*b[10]) (void (*)());
>3. doube(*)() (*pa)[9];
答案与分析:
对复杂变量建立一个类型别名的方法很简单,你只要【在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头】就行了。
>1:int *(*a[5])(int, char*);
//pFun是我们建的一个类型别名
typedef int *(*pFun)(int, char*);
//使用定义的新类型来声明对象,等价于int* (*a[5])(int, char*);
pFun a[5];
>2:void (*b[10]) (void (*)());
//首先为上面表达式蓝色部分声明一个新类型
typedef void (*pFunParam)();
//整体声明一个新类型
typedef void (*pFun)(pFunParam);
//使用定义的新类型来声明对象,等价于void (*b[10]) (void (*)());
pFun b[10];
>3. doube(*)() (*pa)[9];
//首先为上面表达式蓝色部分声明一个新类型
typedef double(*pFun)();
//整体声明一个新类型
typedef pFun (*pFunParam)[9];
//使用定义的新类型来声明对象,等价于doube(*)() (*pa)[9];
pFunParam pa;

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
董月峰 发表于 2014-4-4 16:29
其中://给指向函数的指针起别名
typedef int (*MySum)(int, int);  这一句怎么理解?原名是什么? 别名是 ...

谢谢回答,我是对typedef针对指向函数的指针的格式有点不解。
回复 使用道具 举报
脸皮猴 发表于 2014-4-4 16:20
MySum 就是别名;
原名这个词只是便于理解,其实意思就是定义一个类型名称,这个类型就是int (*)(int, int) ...

谢谢回答,我明白了!
回复 使用道具 举报
悟中生有 发表于 2014-4-4 16:28
这里我想弄明白typedef是怎么对指向函数的指针进行操作的。谢谢你!

额。我这还是没有表达清楚 - -  其实我里面说的有那个怎么操作的想法。
回复 使用道具 举报
  1. 首先复习一下指向函数的指针:
  2. int sum(int a,int b){
复制代码

回复 使用道具 举报
zjw66485542 发表于 2014-4-4 16:36
额。我这还是没有表达清楚 - -  其实我里面说的有那个怎么操作的想法。

嗯 我理解了 这个是typedef针对指向函数的指针的固定格式。
回复 使用道具 举报



#include <stdio.h>
int sum(int a, int b) {
        int c = a + b;
        printf("%d + %d = %d\n", a, b, c);
    return a+b;
}
//原名未用别名指针
int (*MySum)(int, int);
//用typedef别名MySum
typedef int(*MySum)(int ,int);


int main() {
    /*//原来只能用Sum
     Sum= sum;
     (*Sum)(4, 5);             //只能用Sum充当指针变量
     */
    //现在可以
    MySum  sss=sum;    //相当于MySum 有个对象吧
    (*sss)(4,5);
    return 0;
}

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
首先复习一下指向函数的指针:
int sum(int a,int b){
-----int c=a+b;
-----return c;
}
void test(){
-----int (*p)(int,int);
-----p=sum;
-----(*p)(4,5);
}
使用typedef:
void test(){
-----typedef int(*SumPoint)(int,int);/SumPoint就是别名。这里的SumPoint就相当于上面的p
-----SumPoint p=sum;
----(*p)(4,5);
}

回复 使用道具 举报

嗯 知道了 看过了  现在明白了。谢谢指教。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马