#define _CRT_SECURE_NO_WARNINGS//必须放在第一行
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
/*
* C标准规定:函数名也表示函数的入口地址,函数Max==&Max
* 函数指针可以指向相同类型的函数族
* void qsort(
void *base,//数组起始地址
size_t num,//数组长度
size_t width,//每个单元字节数
int (__cdecl *compare )(const void *, const void *) //比较规则
);
*
* 作业1:动态创建二维数组,使用完后销毁 ,如何验证,加入数组名为brr,brr[0][0] = 1;
*/
int Cmp_int(const void* vp1, const void* vp2)
{
return *(int*)vp1 - *(int*)vp2;
}
int Cmp_double(const void* vp1, const void* vp2)
{
double a = *(double*)vp1;
double b = *(double*)vp2;
if (a > b)
return 1;
else if (a < b)
return -1;
else
return 0;
}
//找出数据超过一半的数字.例如 1,2,1,3,1; 1,3,1,3,2,3,3
//算法1:排序;2.返回中间值
int Find(int* arr, int len)
{
qsort(arr,len,sizeof(int),Cmp_int);
//void* vp1 = arr;
//*vp1;//error
//vp1 + 1;
return arr[len / 2];
}
void Show(double* arr, int len)
{
for (int i = 0; i < len; i++)
printf("%.1f ",arr[i]);
printf("\n");
}
//函数指针的应用
int main()
{
/*char a = 'A';
short b = 10;
int c = 100;
void* vp1 = &a;
vp1 = &b;
vp1 = &c;*/
int arr[] = {1,2,3,45,67,89,90,12,34,15,67,88,99,16};
int len = sizeof(arr) / sizeof(arr[0]);
qsort(arr,len,sizeof(int), Cmp_int);
double brr[] = {12.3,12.4,12.2,34.5,22.2,35.6,23.1};
int len2 = sizeof(brr) / sizeof(brr[0]);
qsort(brr,len2,sizeof(double),Cmp_double);
Show(brr,len2);
short crr[] = {10,13,11,2,5,7,9,15,67,89.21};
//todo
//qsort;
//Show;
return 0;
}
/*
int max(int a, int b)
{
return a > b ? a : b;
}
int Min(int a, int b)
{
return a < b ? a : b;
}
int Avg(int a, int b)
{
return (a + b) / 2;
}
int Max5()
{
return 0;
}
int Max2(int a)
{
return 0;
}
void Max3(int a, int b)
{}
int Max4(int a, short b)
{
return 0;
}
int main()
{
int f1();
int* f2();//f2是个函数,没有参数,返回值为int*
int f3(int*, int*);
int* f4(int *,int *);
int (*f5)(int, int);//f5一定是指针,指向函数,这个函数两个int作为参数,返回值为int
//指向函数的指针,简称函数指针
//这个指针可以指向 int x(int,int);这个函数族
f5 = &max;
printf("%d\n",( * f5)(10, 20));
f5 = Min;//等同&Min
printf("%d\n",f5(100,200));
//f5 = Max5;//error
//f5 = Max2;//error
//f5 = Max3;//error
//f5 = Max4;//error
return 0;
}
*/
#if 0
//void Fun(int** brr)//error
void Fun(int (*brr)[4],int row,int col)//这个函数只能使用row行,4列的二维数组
{}
//愿望:处理row行,col列的二维数组
void Fun2(int* brr, int row, int col)
{}
void Fun1(int* arr, int len)
{}
int main()
{
int* p1;
int a[10];
int* p = a;
int * b[10];//[]优先级高于*,b一定是数组,长度为10,每个单元类型为int的数组
//保存指针的数组,指针数组
int(*c)[4];//c一定是指针,指向长度为4,类型为int的数组
//指向数组的指针,简称 数组指针
int brr[3][4];
int(*p2)[4] = brr;
Fun(brr,3,4);
int crr[5][4];
Fun(crr,5,4);
int drr[5][5];
//Fun(drr,5,5);
//printf("%p,%p\n",brr,brr+1);
//int crr[4] = brr[0];//error
//int crr[4];
//crr = brr[0];//error
int* p3 = brr[0];
int k = 1;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
//printf("%p,", &brr[i][j]);
brr[i][j] = k++;
printf("%d ",brr[i][j]);
}
printf("\n");
}
printf("brr[0][4]=%d\n",brr[0][4]);
return 0;
}
#endif