请教typedef这一用法到底是做什么用的?不胜感激!

时间:2022-07-13 02:43:36
请问有哪位知不知道下面这个语句中typedef到底起什么作用?
typedef int (*fcmp) (const void*,const void*);
从来没有这样看过这样用typedef的
我在编译源程序时还真少不了那个typedef,去掉了,编译就通不过了
源程序如下:
#include <stdlib.h>
#include <stdio.h>

typedef int (*fcmp) (const void*,const void*);
int array[]={21,25,12,49,16,8};
int numcmp (const int *p1, const int *p2)
{
   int value ;
   value = *p1 - *p2 ;
   if( value == 0)
   return 0;
   else if( value < 0)
   return -1;
   else 
   return 1;
}
 
int main( void )
{
   int i;
   printf("before qsort the array is:\n");
   for( i = 0; i < 6; i++)
   printf("%6d",array[i]);
   qsort(array, 6, sizeof (int),(fcmp)(numcmp));//(qsort是系统库函数,用于对数据排序) fcmp明明有两个参数,而此处怎么只有一个numcmp函数作为参数传给它?

   printf("\n after qsort the array is:\n");
   for( i = 0; i < 6; i++)
   printf("%6d",array[i]);
   printf("\n");
   return 0;

给出有效解决者给予满分,并不胜感激!

23 个解决方案

#1


typedef定义的是一个带2个参数的函数

#2


ypedef定义的是一个带2个参数的函数指针吧

#3


一般书上讲typedef的语法为:  typedef a b;意思就是说把a取一个新名字叫b,
那照这种说法,上面的typedef语句岂不是将int类型重新取一个新名字叫那个函数的名字?
这感觉说不通啊?怎么也不能理解这样的语句
比方说,取一个一般typedef的用法:typedef char *ptr_to_char;这个用法就很好解释,就是把标识符ptr_to_char作为指向字符的指针类型的新名字.
但上面那个typedef用法怎么也感觉解释不通

#4


qsort(array, 6, sizeof (int),(fcmp)(numcmp));//(qsort是系统库函数,用于对数据排序) fcmp明明有两个参数,而此处怎么只有一个numcmp函数作为参数传给它?
------------------
小心的问下,函数可以做参数吗??

#5


很想听听你对这个用法(fcmp)(numcmp)的详细解释,从语法上来讲!
谢谢!

#6


函数的地址作为参数传递

#7


qsort(array, 6, sizeof (int),(fcmp)(numcmp));
相当于
typedef int (*fcmp) (const void*,const void*);
fcmp NewCompareFunction = (fcmp)numcmp;
qsort(array, 6, sizeof (int), NewCompareFunction);

至于 numcmp 需要的参数,则由qsort 在排序过程中传给它

#8


我也是这么理解的,我说法有点不对!
再问一下,那个fcmp有两个参数,(fcmp)(numcmp)这样用,意思是不是相当于将numcmp中的两个参数传给了fcmp?

#9


比如说
typedef void (* TEST)( void );  // 声明函数指针类型

void Test( void ) {
    return;
}

int main( void ) {
    TEST myTest = Test;  // 定义函数指针 myTest,并将函数 Test 的地址赋值给 myTest
    myTest();            // 通过函数指针调函数,此处等价于 Test();
    return( 0 );
}

#10


qsort的第四个参数的形式是
(*fcmp)(const void *, const void *)
所以numcmp要强制转换为fcmp

#11


不知道说的对不?

#12


int numcmp (const int *p1, const int *p2)

#13


再问一下,那个fcmp有两个参数,(fcmp)(numcmp)这样用,意思是不是相当于将numcmp中的两个参数传给了fcmp?

fcmp 只是 typedef 声明出来的类型,并不是实际定义的一个变量(指针也是变量),就相当于我给出的例子中的 TEST

2个参数在qsort执行的过程中会传递给类型为 fcmp 的函数,即 numcmp

至于 fcmp 在此处的作用,正如 studyall123(战略高手(一切从最简单的做起))  所说
------------------------------------------
studyall123(战略高手(一切从最简单的做起)) :

qsort的第四个参数的形式是
(*fcmp)(const void *, const void *)
所以numcmp要强制转换为fcmp

#14


再问一下,那个fcmp有两个参数,(fcmp)(numcmp)这样用,意思是不是相当于将numcmp中的两个参数传给了fcmp?
----------
不是吧

#15


fcmp只是个类型,刚刚你不是说了

#16


可以看这里,相似的帖子
http://community.csdn.net/Expert/topic/5442/5442874.xml?temp=.7530939

#17


to: studyall123(战略高手(一切从最简单的做起)) 

呵呵,我是复制楼主的话来着,中间换行了的,问号后面才是我说的 ^___^

#18


http://blog.csdn.net/studyall123/archive/2007/03/26/1541270.aspx

#19


呵呵,这么晚还有志同道合者

#20


呵呵,电脑前呆久了,昏了头了!让我再想想!

#21


看这
http://faq.csdn.net/read/217385.html

#22


跟C#里的委托(delegate)很像
typedef int (*fcmp) (const void*,const void*);相当于声明委托,委托的名字是fcmp,委托的参数是两个空指针,委托返回参数是int型。),(qsort(array, 6, sizeof (int),(fcmp)(numcmp));相当于实例化委托,而在qsort内部实现市会进行委托调用,在qsort实现时会传参数给fcmp,但是会运行numcmp中的程序,参数从void*转化成int*。

其实C#里应该就是引用这种思想,委托本质上就是个函数指针

#23


int   (*fcmp)   (const   void*,const   void*); 
本来这句的意思是定义一个指向以两个指向常量的指针为参数,并且返回类型为整型的函数的指针,说简单点,就是函数指针,但加上个typedef之后,让人费解。

#1


typedef定义的是一个带2个参数的函数

#2


ypedef定义的是一个带2个参数的函数指针吧

#3


一般书上讲typedef的语法为:  typedef a b;意思就是说把a取一个新名字叫b,
那照这种说法,上面的typedef语句岂不是将int类型重新取一个新名字叫那个函数的名字?
这感觉说不通啊?怎么也不能理解这样的语句
比方说,取一个一般typedef的用法:typedef char *ptr_to_char;这个用法就很好解释,就是把标识符ptr_to_char作为指向字符的指针类型的新名字.
但上面那个typedef用法怎么也感觉解释不通

#4


qsort(array, 6, sizeof (int),(fcmp)(numcmp));//(qsort是系统库函数,用于对数据排序) fcmp明明有两个参数,而此处怎么只有一个numcmp函数作为参数传给它?
------------------
小心的问下,函数可以做参数吗??

#5


很想听听你对这个用法(fcmp)(numcmp)的详细解释,从语法上来讲!
谢谢!

#6


函数的地址作为参数传递

#7


qsort(array, 6, sizeof (int),(fcmp)(numcmp));
相当于
typedef int (*fcmp) (const void*,const void*);
fcmp NewCompareFunction = (fcmp)numcmp;
qsort(array, 6, sizeof (int), NewCompareFunction);

至于 numcmp 需要的参数,则由qsort 在排序过程中传给它

#8


我也是这么理解的,我说法有点不对!
再问一下,那个fcmp有两个参数,(fcmp)(numcmp)这样用,意思是不是相当于将numcmp中的两个参数传给了fcmp?

#9


比如说
typedef void (* TEST)( void );  // 声明函数指针类型

void Test( void ) {
    return;
}

int main( void ) {
    TEST myTest = Test;  // 定义函数指针 myTest,并将函数 Test 的地址赋值给 myTest
    myTest();            // 通过函数指针调函数,此处等价于 Test();
    return( 0 );
}

#10


qsort的第四个参数的形式是
(*fcmp)(const void *, const void *)
所以numcmp要强制转换为fcmp

#11


不知道说的对不?

#12


int numcmp (const int *p1, const int *p2)

#13


再问一下,那个fcmp有两个参数,(fcmp)(numcmp)这样用,意思是不是相当于将numcmp中的两个参数传给了fcmp?

fcmp 只是 typedef 声明出来的类型,并不是实际定义的一个变量(指针也是变量),就相当于我给出的例子中的 TEST

2个参数在qsort执行的过程中会传递给类型为 fcmp 的函数,即 numcmp

至于 fcmp 在此处的作用,正如 studyall123(战略高手(一切从最简单的做起))  所说
------------------------------------------
studyall123(战略高手(一切从最简单的做起)) :

qsort的第四个参数的形式是
(*fcmp)(const void *, const void *)
所以numcmp要强制转换为fcmp

#14


再问一下,那个fcmp有两个参数,(fcmp)(numcmp)这样用,意思是不是相当于将numcmp中的两个参数传给了fcmp?
----------
不是吧

#15


fcmp只是个类型,刚刚你不是说了

#16


可以看这里,相似的帖子
http://community.csdn.net/Expert/topic/5442/5442874.xml?temp=.7530939

#17


to: studyall123(战略高手(一切从最简单的做起)) 

呵呵,我是复制楼主的话来着,中间换行了的,问号后面才是我说的 ^___^

#18


http://blog.csdn.net/studyall123/archive/2007/03/26/1541270.aspx

#19


呵呵,这么晚还有志同道合者

#20


呵呵,电脑前呆久了,昏了头了!让我再想想!

#21


看这
http://faq.csdn.net/read/217385.html

#22


跟C#里的委托(delegate)很像
typedef int (*fcmp) (const void*,const void*);相当于声明委托,委托的名字是fcmp,委托的参数是两个空指针,委托返回参数是int型。),(qsort(array, 6, sizeof (int),(fcmp)(numcmp));相当于实例化委托,而在qsort内部实现市会进行委托调用,在qsort实现时会传参数给fcmp,但是会运行numcmp中的程序,参数从void*转化成int*。

其实C#里应该就是引用这种思想,委托本质上就是个函数指针

#23


int   (*fcmp)   (const   void*,const   void*); 
本来这句的意思是定义一个指向以两个指向常量的指针为参数,并且返回类型为整型的函数的指针,说简单点,就是函数指针,但加上个typedef之后,让人费解。