繁体   English   中英

typedef和C中函数的指针

[英]typedef and pointer to function in C

以下是Richard Reese的“理解和使用C指针”中的示例。 我的问题是它应该是第7行的“typedef int(* fptrOperation)......”吗? 我尝试了他们两个,但他们都运作良好。 我搜索了typedef和指针在线运行两天的用法,但仍然没有想出来。 谢谢你的帮助~~

#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;
}    

不要紧。

这是因为对于函数参数,函数类型会自动转换为指向函数的指针( ISO / IEC 9899: 2011,6.7.6.3,§8):

参数声明为''函数返回类型''应调整为''函数返回类型的指针'',如6.3.2.1所述。

C99 6.3.2.1左值,数组和函数指示符:

4函数指示符是具有函数类型的表达式。 除非它是sizeof运算符或一元&运算符的操作数,否则具有类型''函数返回类型''的函数指示符将转换为具有类型''指向函数返回类型'的指针的表达式。

6.5.3.2地址和间接运营商:

4一元*运算符表示间接。 如果操作数指向函数,则结果是函数指示符;

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM