回调函数
回过头来调用的函数
#include <stdio.h>
 #include <stdlib.h>
int Find_Max(int arr[], int n){
     int max_value = arr[0];
     for (int i = 1; i < n; ++i){
         if (max_value < arr[i])
             max_value = arr[i];
     }
     return max_value;
 }
int Find_Min(int arr[], int n){
     int min_value = arr[0];
     for (int i = 1; i < n; ++i){
         if (min_value > arr[i])
             min_value = arr[i];
     }
     return min_value;
 }
 int main(){
     int arr[] = { 5, 8, 9, 2, 3, 1, 0, 4 };
     int n = sizeof(arr) / sizeof (arr[0]);
    printf("max_value = %d\n",Find_Max(arr,n));
     printf("min_value = %d\n",Find_Min(arr, n));
     system("pause");
     return 0;
 }
怎么写出一个通用的函数,可以想查找最大就是最大,想查找最小就是最小
#include <stdio.h>
 #include <stdlib.h>
int Find_Max(int arr[], int n){
     int max_value = arr[0];
     for (int i = 1; i < n; ++i){
         if (max_value < arr[i])
             max_value = arr[i];
     }
     return max_value;
 }
int Find_Min(int arr[], int n){
     int min_value = arr[0];
     for (int i = 1; i < n; ++i){
         if (min_value > arr[i])
             min_value = arr[i];
     }
     return min_value;
 }
//
int Find(int arr[], int n, int(*pfun)(int arr[], int n)){//通用
    return pfun(arr, n);
}
int main(){
     int arr[] = { 5, 8, 9, 2, 3, 1, 0, 4 };
     int n = sizeof(arr) / sizeof (arr[0]);
  //  printf("max_value = %d\n",Find_Max(arr,n));
  //   printf("min_value = %d\n",Find_Min(arr, n));
      printf("max_value = %d\n",Find(arr,n,Find_Min));   
        system("pause");
     return 0;
 }
只要是有函数参数里有函数参数当参数的就是回调函数.
冒泡排序:
#include <stdio.h>
 #include <stdlib.h>
void PrintArr(int arr[], int n){
     for (int i = 0; i < n; i++){
         printf("%d",arr[i]);
     }
     printf("\n");
 }
 void bob(int arr[],int n){
     for (int i = 0; i < n - 1; i++){
         for (int j = 0; j < n - i - 1; j++){
             if (arr[j] > arr[j + 1]){
                 int tmp = arr[j];
                 arr[j] = arr[j + 1];
                 arr[j + 1] = tmp;
             }
        }
     }
 }
 int main(){
     int arr[] = { 5, 8, 9, 2, 3, 1, 0, 4 };
     int n = sizeof(arr) / sizeof (arr[0]);
     PrintArr(arr, n);
     bob(arr, n);
     PrintArr(arr,n);
     system("pause");
     return 0;
 }
改成快速排序:
#include <stdio.h>
 #include <stdlib.h>
void PrintArr(int arr[], int n){
     for (int i = 0; i < n; i++){
         printf("%d",arr[i]);
     }
     printf("\n");
 }
 void bob(int arr[],int n){
     for (int i = 0; i < n - 1; i++){
         for (int j = 0; j < n - i - 1; j++){
             if (arr[j] > arr[j + 1]){
                 int tmp = arr[j];
                 arr[j] = arr[j + 1];
                 arr[j + 1] = tmp;
             }
        }
     }
 }
 int comp_int(const void *a, const void *b){
     const int *pa = (const int*)a;
     const int *pb = (const int*)b;
     return (*pa - *pb);
 }
 int main(){
     int arr[] = { 5, 8, 9, 2, 3, 1, 0, 4 };
     int n = sizeof(arr) / sizeof (arr[0]);
     PrintArr(arr, n);
     //bob(arr, n);
     qsort(arr, n, sizeof(int), comp_int);
     PrintArr(arr,n);
     system("pause");
     return 0;
 }
简单的概念强化:
#include <stdio.h>
 #include <stdlib.h>
 int main(){
     char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f', };
    printf("%d\n", sizeof(arr)); // 6
     printf("%d\n", sizeof(arr + 0)); // 4(一个地址的大小)
     printf("%d\n", sizeof(*arr)); // 1
     printf("%d\n", sizeof(arr[1])); // 1
     printf("%d\n", sizeof(&arr)); // 4
     printf("%d\n", sizeof(&arr[0] + 1)); //4 
     printf("%d\n", sizeof(&arr + 1)); // 4
     printf("%d\n", strlen(arr)); // ?(随机数)
     printf("%d\n", strlen(arr + 0)); //  ?
     printf("%d\n", strlen(*arr)); // 无(取的是一个字符,没法求字符串长度)
     printf("%d\n", strlen(arr[1])); // 无
     printf("%d\n", strlen(&arr)); // ?
     printf("%d\n", strlen(&arr + 1)); // ?
     printf("%d\n", strlen(&arr[0] + 1)); // ?
    system("pause");
     return 0;
 }

#include <stdio.h>
 #include <stdlib.h>
 int main(){
     char arr[] ="abcdef";
    printf("%d\n", sizeof(arr)); // 7
     printf("%d\n", sizeof(arr + 0)); // 4(一个地址的大小)
     printf("%d\n", sizeof(*arr)); // 1
     printf("%d\n", sizeof(arr[1])); // 1
     printf("%d\n", sizeof(&arr)); // 4
     printf("%d\n", sizeof(&arr[0] + 1)); //4 
     printf("%d\n", sizeof(&arr + 1)); // 4
     printf("%d\n", strlen(arr)); // 6
     printf("%d\n", strlen(arr + 0)); //  6
     //printf("%d\n", strlen(*arr)); // 无
     //printf("%d\n", strlen(arr[1])); // 无
     printf("%d\n", strlen(&arr)); // 6
     printf("%d\n", strlen(&arr + 1)); // ?
     printf("%d\n", strlen(&arr[0] + 1)); // 5
    system("pause");
     return 0;
 }

#include <stdio.h>
 #include <stdlib.h>
 int main(){
     char *p ="abcdef";
    printf("%d\n", sizeof(p)); // 4
     printf("%d\n", sizeof(p + 0)); // 4(一个地址的大小)
     printf("%d\n", sizeof(*p)); // 1
     printf("%d\n", sizeof(p[0])); // 1
     printf("%d\n", sizeof(&p)); // 4
     printf("%d\n", sizeof(&p[0] + 1)); //4 
     printf("%d\n", sizeof(&p + 1)); // 4
     printf("%d\n", strlen(p)); // 6
     printf("%d\n", strlen(p + 1)); //  5
     //printf("%d\n", strlen(*p)); // 无
     //printf("%d\n", strlen(p[0])); // 无
     printf("%d\n", strlen(&p)); // ?
     printf("%d\n", strlen(&p + 1)); // ?
     printf("%d\n", strlen(&p[0] + 1)); // 5
    system("pause");
     return 0;
 }

总结:数组名的意义:
1.sizeof(数组名),这里数组名表示整个数组,计算的是整个数组的大小.
2.&数组名,这里的数组名表示整个数组,去除的是整个数组的地址.
3.除此之外所有的数组名都表示首元素的地址.