函数指针数组指针如何作为参数写入一个函数内部,比如函数指针数组为int(*Cmp[5])(Con*,const char*,int) = {Cmp_name,Cmp_sex ,Cmp_age,Cmp_tel,Cmp_adress }; ,第一个问题将这个函数指针数组作为该参数如何存放在一个函数内,比如这个函数为void Pp_Delask(),第二个问题,在这个函数内部想调用函数指针数组中的一个函数如何表达这个函数
时间: 2023-03-13 20:30:47 浏览: 124
答:将函数指针数组作为参数存放在函数内部可以使用函数参数传递的方式,比如在函数Pp_Delask()中声明一个参数int(*Cmp[5])(Con*,const char*,int),在调用函数时将函数指针数组传入该参数即可。调用函数指针数组中的一个函数可以使用指针的方式,比如在函数Pp_Delask()中定义一个函数指针int(*p)(Con*,const char*,int),将它指向函数指针数组中的一个函数,比如(*p)=Cmp_name,然后直接调用(*p)(Con*,const char*,int)即可。
相关问题
int cmp(const void* a, const void* b) {//定义一个比较函数 int* a1 = (int*)a; int* b1 = (int*)b; return *b1 - *a1;为什么要转化为int指针类型
这是因为在标准库函数qsort中,比较函数cmp的参数类型必须为const void*类型。void*类型是一种通用指针类型,不能进行算术运算,因此无法直接取出指针指向的值进行比较。为了能够从void*类型中取出指向的值,需要先将其转化为具体的指针类型,即将const void*类型的指针转化为int*类型的指针,然后再通过*运算符取出指针所指向的值进行比较。因此,在比较函数cmp中进行类型转换是必要的。
1)输出函数为: void printArray(int arr[], int len){ for(int i=0; i<len; i++){ printf("%d ", arr[i]); } } 2)使用qsort排序并输出: int cmp(const void *a, const void *b){ return *(int*)a - *(int*)b; } //调用 qsort(arr, len, sizeof(int), cmp); printArray(arr, len); 3)使用bsearch查找并输出: int cmp(const void *a, const void *b){ return *(int*)a - *(int*)b; } //调用 int num = 6; int *ptr = (int*)bsearch(&num, arr, len, sizeof(int), cmp); if(ptr != NULL){ printf("%d在数组中的索引值为:%d", num, ptr-arr); //数组下标从0开始 }else{ printf("%d不在数组中", num); }有什么错误
这段代码看起来没有什么大问题。以下是一些小问题:
1. `printArray` 函数中的 `printf` 语句最好在末尾加上一个换行符,这样更易于阅读和输出。
2. `bsearch` 函数找到元素时,应该将 `printf` 语句中的索引值加 1,因为数组下标从 0 开始,而题目中要求输出的索引值从 1 开始。
下面是修改后的代码:
```c++
void printArray(int arr[], int len){
for(int i=0; i<len; i++){
printf("%d ", arr[i]);
}
printf("\n"); // 添加换行符
}
int cmp(const void *a, const void *b){
return *(int*)a - *(int*)b;
}
// 调用 qsort(arr, len, sizeof(int), cmp);
printArray(arr, len);
// 调用 int num = 6;
int *ptr = (int*)bsearch(&num, arr, len, sizeof(int), cmp);
if(ptr != NULL){
printf("%d在数组中的索引值为:%d\n", num, ptr-arr+1); // 数组下标从0开始,索引值加1
}else{
printf("%d不在数组中\n", num);
}
```
阅读全文