C语言笔记第三十三课

一、上课内容

1. 泛型编程
void *p: 通用指针 , 也称泛型指针 , 没有类型的指针 , 仅仅记录地址的开头 , 不能算术运算 ,p+1, 不能*p.malloc 的返回值就是 void *;
void *memcpy(
void *dest,
const void *src,
size_t count
);//内存拷贝函数
dest:目标地址
sec:源地址
count:拷贝的字节数
int main()
{
//int a = 10;
//int b;
strcpy();
//memcpy(&b,&a,sizeof(int));
//printf("%d\n",b);
/*char str1[] = "hello";
char str2[10] = "";
memcpy(str2,str1,strlen(str1)+1);
printf("%s\n",str2);*/
//double arr[] = {12.3,45.6,78.9};
//double brr[3];
/*memcpy(brr,arr,sizeof(arr));*/
//memmove();
//int arr[10] = {1,2,3,4,5,6,7,8,9,10};
//memcpy(&arr[3], &arr[0],7*sizeof(int));//把前面的数据后移三格
//memcpy(&arr[0],&arr[3],7*sizeof(int));//后面的数据前移三格
int arr[10] = {0};
//.....
memset(arr, 0, sizeof(arr));//常用
//memset(arr,1,sizeof(arr));//把每一个字节置1,不要这样使用
return 0;
}

 2.函数指针

指向函数的指针称为函数指针 , 它可以指向一个参数列表相同 , 返回值相同的函数族 .
函数名本身也表示函数的地址 . 例如 Max 等同 &Max.
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;
}
void Fun(int a, int b)
{}
int Fun1(int a)
{
return 0;
}
int main()
{
//pf指向一个函数族(参数列表和返回值类型都必须一样)
int (*pf)(int, int);//pf是指针,指向参数为(int,int),返回值为int的函数.pf是指向
函数的指针简称函数指针
pf = Max;
printf("%d\n",pf(10,20));
pf = Min;
printf("%d\n", pf(10, 20));
pf = Avg;
printf("%d\n", pf(10, 20));
//pf = Fun;//错误的
//pf = Fun1;//错误的
return 0;
}
3.qsort 及应用
qsort: 快速排序函数 , 需要引用 stdlib.h 文件 .
void qsort(
void *base,
size_t num,
size_t width,
int (__cdecl *compare )(const void *, const void *)
);
参数:
base:需要排序的数组
num:数据个数(数组长度)
width:每个数据的字节数(sizeof(数据类型))
compare:比较大小的依据

 在进行排序时,一定需要比较两个数据的大小,由于qsort能对任意的数据进行排序,那么它无法知道排 序的规则,这个需要使用的人通过参数把这个传递给qsort,也就是上面的compare参数。

下面列举一些利用 qsort 的应用示例 .
1. char 类型排序 ( 注意是字符 , 不是字符串 )
2. int 类型排序
3. double 类型排序
4. Student 类型 , 按姓名排序
5. Student 类型 , 按分数排序
typedef struct Student
{
char name[20];//姓名
int score;//分数
}Student;
int Cmp_char(const void* vp1, const void* vp2)
{
return *(char*)vp1 - *(char*)vp2;
}
//int Cmp_int(int* p1, int* p2)
int Cmp_int(const void *vp1,const void*vp2)
{
return *(int*)vp1 - *(int*)vp2;//默认升序
//return -( *(int*)vp1-*(int*)vp2);//降序
}
//int Cmp_double(const double*vp1,const double *vp2);
int Cmp_double(const void* vp1, const void* vp2)
{
//return *(double*)vp1 - *(double*)vp2; //12.3-12.7 == -0.4 -> 0 (这两个
相等) 错误的
double tmp = *(double*)vp1 - *(double*)vp2;
if (tmp > 0)
return 1;
else if (tmp < 0)
return -1;
else
return 0;
}
int Cmp_stu_src(const void* vp1, const void* vp2)
{
return ((Student*)vp1)->score - ((Student*)vp2)->score;
}
int Cmp_stu_name(const void* vp1, const void* vp2)
{
return strcmp(((Student*)vp1)->name, ((Student*)vp2)->name);
}
void Show(int* arr, int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
void Show(double* arr, int len)
{
for (int i = 0; i < len; i++)
{
printf("%.2lf ",arr[i]);
}
printf("\n");
}
void Show(Student* arr, int len)
{
for (int i = 0; i < len; i++)
{
printf("%s,%d\n",arr[i].name,arr[i].score);
}
}
int main()
{
char arr[] = "aajdsfljsadzyxytp";
int brr[] = {1,6,9,0,2,5,8,12,56,7,91};
double crr[] = {12.3,34.5,6.4,12.7,12.2,26.7};
Student drr[] = { {"liubei",80},{"caocao",70},{"sunquan",90},
{"zhangfei",30},{"guanyu",85}};
//qsort(arr,strlen(arr),sizeof(char),Cmp_char);
//printf("%s\n",arr);
//qsort(brr,sizeof(brr)/sizeof(brr[0]),sizeof(int),Cmp_int);
//Show(brr, sizeof(brr) / sizeof(brr[0]));
//qsort(crr, sizeof(crr) / sizeof(crr[0]), sizeof(double), Cmp_double);
//Show(crr, sizeof(crr) / sizeof(crr[0]));
//按分数从低到高
//qsort(drr,sizeof(drr)/sizeof(drr[0]), sizeof(Student), Cmp_stu_src);
//Show(drr, sizeof(drr) / sizeof(drr[0]));
//按姓名排序
qsort(drr, sizeof(drr) / sizeof(drr[0]),sizeof(Student),Cmp_stu_name);
Show(drr, sizeof(drr) / sizeof(drr[0]));
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种广泛应用于软件开发的编程语言,具有简洁、高效、灵活等特点。为了更好地学习和掌握C语言,整理一份完整的笔记是非常有必要的。 首先,C语言的基础知识是理解和掌握该语言的关键。笔记中应包含C语言的基本语法,如变量的声明和定义、数据类型、运算符、控制语句等,这些是编写C程序的基础。 其次,C语言的函数也是非常重要的一部分。函数是C语言中的一种模块化的编程方式,可以提高代码的重用性和可维护性。在笔记中应包含函数的定义和调用、参数传递、函数返回值等内容,以及常用的C库函数的使用。 此外,C语言的数组和指针也是需要重点关注的内容。数组是一种存储多个相同类型数据的方式,而指针则是C语言中与内存地址相关的操作。在笔记中应包含数组的定义和初始化、多维数组的使用、指针的声明和运算等内容。 还有,C语言中的内存管理是需要特别注意的。动态内存分配是C语言的一个重要特性,可以根据需要在运行时分配和释放内存。笔记中应包括动态内存分配的函数,如malloc、free等,以及内存泄漏和内存溢出的问题的解决方法。 最后,C语言的文件操作也是需要掌握的一部分。文件操作是C语言中与磁盘文件进行读写的关键部分,可以实现数据的长久保存和共享。在笔记中应涵盖文件的打开和关闭、读取和写入、文件指针的操作等内容。 综上所述,C语言笔记的完整版应该包含C语言的基础知识、函数、数组和指针、内存管理以及文件操作等内容。通过阅读和整理笔记,可以更好地理解和应用C语言,提高程序编写的效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值