首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >参数在C语言中传递函数?

参数在C语言中传递函数?
EN

Stack Overflow用户
提问于 2020-07-06 17:19:45
回答 3查看 290关注 0票数 0

下面是我在解决hackerrank问题时遇到的问题的代码(未变):

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

当程序从main到func的

让我们先来看看3:

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

现在让我们看一看1和2:

在函数string_sort中

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

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

第二疑问:我们没有传递任何会进入char* a,char* b的参数,它们的值会是什么?

代码语言:javascript
复制
    #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");
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-07-06 18:20:25

string_sort函数的目的是按特定顺序对字符串数组进行排序--确切地说,该顺序取决于作为第三个参数传递的函数指示符。

cmp_func是指向函数的指针-声明读取为

代码语言:javascript
复制
      cmp_func                                -- cmp_func
     *cmp_func                                --   is a pointer to
    (*cmp_func)(                            ) --   a function taking
    (*cmp_func)(            a               ) --     parameter a
    (*cmp_func)(          * a               ) --       is a pointer to
    (*cmp_func)(const char* a               ) --       const char
    (*cmp_func)(const char* a,             b) --     parameter b
    (*cmp_func)(const char* a,           * b) --       is a pointer to
    (*cmp_func)(const char* a, const char* b) --       const char
int (*cmp_func)(const char* a, const char* b) --   returning int

调用string_sort时,传递一个函数指示符作为第三个参数--在本例中,是一个比较函数的名称。然后,string_sort调用该函数作为其操作的一部分,并使用该函数确定如何对数组中的字符串进行排序。

这可能最好用例子来解释。让我们假设string_sort是作为一个简单的旧气泡类型实现的(实际上它可能不会实现,但它可以用于说明性的目的):

代码语言:javascript
复制
void string_sort( char **arr, const int len, int (*cmp_func)(const char *a, const char *b ) )
{
  for ( int i = 0; i < len - 1; i++ )
  {
    for ( j = i+1; j < len; j++ )
    {
      if ( cmp_func( arr[i], arr[j] ) > 0 )
      {
        swap( &arr[i], &arr[j] ); // imagine this being implemented elsewhere
      }
    }
  }
}

字符串排序的顺序取决于cmp_func所指向的比较函数。通常的协议是,如果第一个参数“大于”第二个参数,则比较函数将返回一个正值;如果第一个参数“小于”第二个参数,则返回一个负值;如果两个值“相等”,则返回一个负值。如果第一个参数比第二个参数“大”,我们将交换字符串,否则我们将它们保留为-原样。

什么“更大”、“更少”和“相等”的含义取决于哪个函数被传递给string_sort for cmp_func。假设arr[i] == "foo"arr[j] == "bar"。下面是对每个不同的比较函数(基于函数名)的排序方式(很可能):

代码语言:javascript
复制
cmp_func                               Return value    String order
--------                               ------------    ------------
lexicographic_sort                               >0    "bar", "foo"
lexicographic_sort_reverse                       <0    "foo", "bar"
sort_by_number_of_distinct_characters            <0    "foo", "bar"
sort_by_length                                    0    "foo", "bar"
票数 0
EN

Stack Overflow用户

发布于 2020-07-06 17:38:14

函数string_sort

代码语言:javascript
复制
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如下

代码语言:javascript
复制
string_sort( arr, n, lexicographic_sort );

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

代码语言:javascript
复制
int lexicographic_sort_reverse(const char* a, const char* b) {

}

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

所以

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

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

非定义的函数string_sort的声明可能如下所示

代码语言:javascript
复制
void string_sort( char**, const int, int ( * )(const char*, const char*));

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

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

代码语言:javascript
复制
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_sort胸腺被分配给传递给它的参数cmp_func,参数arr指向的字符串在排序期间对它们进行比较。您需要研究函数string_sort的主体。

票数 0
EN

Stack Overflow用户

发布于 2020-07-06 17:51:08

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

cmp_function不是一个系统函数,它是C中函数的指针,它是将一个函数传递给另一个函数的方法(可以像本例那样作为自定义排序比较器使用,或者在其他用例中用作回调)

对于函数void string_sort(char** arr,const int len,int (*cmp_func)(const char* a, const char* b))

它有三个论点:

arr:指向字符指针的指针

len:int

cmp_funct:指向具有两个参数的函数的指针,这两个参数都是const char*和返回int。

因此,当您调用string_sort时,您必须在第三个参数中传递一个指向函数的指针(函数的名称,或者&在它之前,与这些参数条件匹配,就像int lexicographic_sort_reverse(const char* a, const char* b)sort_by_number_of_distinct_characters中的情况一样)。

第二个疑问:我们没有传递任何会进入char* a,char* b的参数,它们的值会是什么?

我想这个问题现在已经回答了,因为它们不是函数的参数,它们描述传递给函数指针的参数。

我真的建议你读更多关于指向函数的指针,网上有很多关于它的教程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62761242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档