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用法怎么也感觉解释不通
那照这种说法,上面的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 在排序过程中传给它
相当于
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?
再问一下,那个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 );
}
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
(*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
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
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
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#里应该就是引用这种思想,委托本质上就是个函数指针
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之后,让人费解。
本来这句的意思是定义一个指向以两个指向常量的指针为参数,并且返回类型为整型的函数的指针,说简单点,就是函数指针,但加上个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用法怎么也感觉解释不通
那照这种说法,上面的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 在排序过程中传给它
相当于
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?
再问一下,那个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 );
}
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
(*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
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
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
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#里应该就是引用这种思想,委托本质上就是个函数指针
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之后,让人费解。
本来这句的意思是定义一个指向以两个指向常量的指针为参数,并且返回类型为整型的函数的指针,说简单点,就是函数指针,但加上个typedef之后,让人费解。