首页 > 解决方案 > C语言函数中的参数传递?

问题描述

以下是我在解决hackerrank问题时遇到的问题的代码(未更改):

但我无法理解在下面的代码中我标记为数字 1,2 和 3 的 3 行。

当程序从 main 流向 func 时

我们先来看3:

我们将函数名称 lexicographic_sort 作为参数之一传递给 string_sort 函数。

现在让我们看看1和2:

在函数 string_sort

lexicographic_sort 作为 int (cmp_func)(const char a, const char b)* 传递

第一个疑问:什么是 cmp_func,它没有在任何地方定义,它是系统定义的函数吗?

第二个疑问:我们没有传递任何会进入 char* a、char* b 的参数。他们的价值观会怎样?

    #include <stdio.h>
    
    #include <stdlib.h>
    
    #include <string.h>

 1. int lexicographic_sort(const char* a, const char* b) {

    }
    
    int lexicographic_sort_reverse(const char* a, const char* b) {
    
    }
    
    int sort_by_number_of_distinct_characters(const char* a, const char* b) {
        
    }
    
    int sort_by_length(const char* a, const char* b) {
    
    }

 2. void string_sort(char** arr,const int len,int (*cmp_func)(const char* a, const char* b))

    {
        
    
    }


    int main() 
    {
        int n;
    scanf("%d", &n);
  
    char** arr;
    arr = (char**)malloc(n * sizeof(char*));
  
    for(int i = 0; i < n; i++){
        *(arr + i) = malloc(1024 * sizeof(char));
        scanf("%s", *(arr + i));
        *(arr + i) = realloc(*(arr + i), strlen(*(arr + i)) + 1);
    }
  
    

 3. string_sort(arr, n, lexicographic_sort);

        for(int i = 0; i < n; i++)
            printf("%s\n", arr[i]);
        printf("\n");
    
        string_sort(arr, n, lexicographic_sort_reverse);
        for(int i = 0; i < n; i++)
            printf("%s\n", arr[i]); 
        printf("\n");
    
        string_sort(arr, n, sort_by_length);
        for(int i = 0; i < n; i++)
            printf("%s\n", arr[i]);    
        printf("\n");
    
        string_sort(arr, n, sort_by_number_of_distinct_characters);
        for(int i = 0; i < n; i++)
            printf("%s\n", arr[i]); 
        printf("\n");
    }

标签: c

解决方案


功能string_sort

void string_sort( char** arr, const int len, int (*cmp_func)(const char* a, const char* b) );

声明为具有三个参数。第一个是类型char **。第二个类型const int。第三个类型int (*)(const char* a, const char* b)的第三个参数是指向函数的指针,该函数具有类型const char *和返回类型两个参数int。此参数在函数string_sort中用于比较两个字符串。

然后该函数string_sort被称为

string_sort( arr, n, lexicographic_sort );

其中第三个参数是lexicographic_sort_reverse声明的函数

int lexicographic_sort_reverse(const char* a, const char* b) {

}

具有函数的第三个参数所需的类型string_sortlexicographic_sort用作第三个参数的函数指示符被隐式转换为指向函数的指针。

所以

第一个疑问:什么是 cmp_func,它没有在任何地方定义,它是系统定义的函数吗?

cmp_func是函数参数的名称string_sort。在同时是函数定义的函数声明中,必须存在参数名称。

不是定义的函数 string_sort 的声明可能看起来像

void string_sort( char**, const int, int ( * )(const char*, const char*));

也就是说,参数的名称不是必需的。

您可以通过以下方式想象函数定义及其调用

string_sort(arr, n, lexicographic_sort);

//...

void string_sort( /*char** arr,const int len,int (*cmp_func)(const char* a, const char* b) */)
{
    char **arr1 = arr; // I changed the name of the parameter to arr1
    const int len = n;
    int (*cmp_func)(const char* a, const char* b) = lexicographic_sort;
    //...
}

第二个疑问:我们没有传递任何会进入 char* a、char* b 的参数。他们的价值观会怎样?

正是函数string_sort在自身内部调用了函数lexicographic_sortthyat,该函数被分配给cmp_func传递给它的参数 arr 指向的字符串,以便在排序期间对它们进行比较。您需要调查函数的主体string_sort


推荐阅读