c - 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");
}
解决方案
功能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_sort
。lexicographic_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_sort
thyat,该函数被分配给cmp_func
传递给它的参数 arr 指向的字符串,以便在排序期间对它们进行比较。您需要调查函数的主体string_sort
。
推荐阅读
- ceph - 使用 cephadm 安装 ceph 章鱼
- c# - C#计算问题计算所得税(PAYE)
- python - 为什么我们在绘图时使用“gca”?
- linux - docker daemon 无法启动
- uml - 用于异步执行的 Plantuml 序列图生命线
- python - TF 2.3 在一个循环中运行多个模型会随着时间的推移而变慢
- swift - MKGeodesicPolyline 可以沿线划分为任意数量的点吗?
- alfresco - 为什么 Alfresco 节点浏览器和编程相同的查询执行之间存在差异?
- azure - 在没有数据丢失或中断的情况下批量整合和编辑 Azure 标记?
- salesforce - 合并两个 Salesforce SOQL 查询