Here is an example from 'Understanding and Using C Pointers' by Richard Reese. My question is should it be "typedef int (*fptrOperation)......" in the 7th line? I tried both of them, but they all worked well. I searched the usage of typedef and pointer to function online for two days but still didnit figure it out. Thanks for any help~~
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
typedef int (fptrOperation)(const char*, const char*);//
char* stringToLower(const char* string) {
char *tmp = (char*) malloc(strlen(string) + 1);
char *start = tmp;
while (*string != 0) {
*tmp++ = tolower(*string++);
}
*tmp = 0;
return start;
}
int compare(const char* s1, const char* s2) {
return strcmp(s1,s2);
}
int compareIgnoreCase(const char* s1, const char* s2) {
char* t1 = stringToLower(s1);
char* t2 = stringToLower(s2);
int result = strcmp(t1, t2);
free(t1);
free(t2);
return result;
}
void displayNames(char* names[], int size) {
for(int i=0; i<size; i++) {
printf("%s ",names[i]);
}
printf("\n");
}
void sort(char *array[], int size, fptrOperation operation) {
int swap = 1;
while(swap) {
swap = 0;
for(int i=0; i<size-1; i++) {
if(operation(array[i],array[i+1]) > 0){
swap = 1;
char *tmp = array[i];
array[i] = array[i+1];
array[i+1] = tmp;
}
}
}
}
int main(int argc, char const *argv[])
{
char* names[] = {"Bob", "Ted", "Carol", "Alice", "alice"};
sort(names,5,compareIgnoreCase);
displayNames(names,5);
return 0;
}
答案 0 :(得分:5)
没关系。
这是因为对于函数参数,函数类型会自动转换为指向函数的指针(ISO/IEC 9899:2011,6.7.6.3,§8):
参数声明为''函数返回类型''应调整为''函数返回类型的指针'',如6.3.2.1中所述。
答案 1 :(得分:3)
C99 6.3.2.1左值,数组和函数指示符:
4函数指示符是具有函数类型的表达式。 除非它是sizeof运算符或一元&amp;运算符的操作数。 operator,一个函数指示符,类型为''函数返回类型'' 转换为具有类型''指向函数的指针的表达式 返回类型''。
6.5.3.2地址和间接运算符:
4一元*运算符表示间接。如果操作数指向a 函数,结果是函数指示符;
6.7.5.3函数声明符(包括原型):
8参数声明为''函数返回类型''应为 调整为''指向函数返回类型的指针'',如6.3.2.1。
因此,您的示例甚至以下内容都是有效的:
#include <stdio.h>
void foo(void)
{
puts("foo");
}
int main(void)
{
foo();
(&foo)();
(*foo)();
return 0;
}