我是靠谱客的博主 甜甜楼房,这篇文章主要介绍C语言 指针进阶7 8最终篇 模仿qsort函数实现冒泡排序通用算法 指针题模仿qsort函数实现冒泡排序通用算法数组名字符数组,现在分享给大家,希望可以做个参考。
模仿qsort函数实现冒泡排序通用算法
bubble_sort
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120void Swap(char* buf1, char* buf2, int width) { int i = 0; for (i = 0; i < width; i++) { //*buf 访问一个字节 char tmp = *buf1; *buf1 = *buf2; *buf2 = tmp; buf1++; buf2++; } } void bubble_sort(void* base, int sz, int width, int(*cmp)(const void* e1, const void* e2)) { int i = 0;//确定趟数 for (i = 0; i < sz; i++) { int j = 0;//一趟的元素 for (j = 0; j < sz - 1 - i; j++) { //两个元素比较 //假设整型数组比较 arr[j] arr[j+1] //e1 e2是指向下面两个元素的指针所以要用地址。 if (cmp((char*)base + j * width, (char*)base+(j+1)*width) > 0) { //为什么是(char*)base //char* 是1byte正好是最小的,可以用来随意改变访问的跨度 //因为char* 所占内存最小,加一个元素所占字节就一定会跳到下一个元素的地址。若是转化为int* 等其他类型,而元素所占字节小于4,加上元素所占字节,就不能跳到下一个元素。 //(char*)base+几个字节就是偏移几个字节 //交换 .只给起始地址不够因为不知道交换的类型 所以加上了width Swap((char*)base + j * width, (char*)base + (j + 1) * width,width);//传两个地址加一个字节个数 ,单个字节进行交换 //因为元素的类型肯定是相同的,即使我们不知道具体的元素类型是什么,具体有几个字节。但是我们通过char指针,将两个元素的每个字节都进行交换,这样也可以达到交换的效果 } } } } int cmp_int(const void* e1, const void* e2) { return *(int*)e1 - *(int*)e2; } void print_arr(int arr[], int sz) { int i = 0; for (i = 0; i < sz; i++) { printf("%d", arr[i]); } printf("n"); } void test1() { int arr[10] = { 9,8,7,6,5,4,3,2,1,0 }; int sz = sizeof(arr) / sizeof(arr[0]);//10个数排序需要9躺 所以需要提前计算元素个数 bubble_sort(arr, sz, sizeof(arr[0]), cmp_int); print_arr(arr, sz); return 0; } struct Stu { char name[20]; int age; }; int sort_by_age(const void* e1, const void* e2) { return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age; } int sort_by_name(const void* e1, const void* e2) { return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name); }//名字是字符串所以用strcmp 他的返回值是一样的.strcmp是比较字符串大小的函数 两个参数之间用,隔开 返回值只有正副和0 void test2() { struct Stu s[] = { {"zhangsan",30},{"lisi",34},{"wangwu",20} }; //年龄排序 int sz = sizeof(s) / sizeof(s[0]); //qsort(s, sz, sizeof(s[0]), sort_by_age); bubble_sort(s, sz, sizeof(s[0]), sort_by_name); } int main() { //模仿qsort函数实现冒泡排序通用算法 test1(); test2(); return 0; }
没有具体类型所以能存储任意类型的指针,但是不能解引用
数组名
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29//sizeof(数组名) 数组明表示整个数组的 计算的整个数组的大小 //&数组名 数组名表示数组 取出的是整个数组的地址 //除此之外 所有的数组名都是数组首元素的地址 int main() { int a[] = { 1,2,3,4 }; printf("%dn", sizeof(a));//16 printf("%dn", sizeof(a+0));//第一个元素地址 4/8因为32平台4 printf("%dn", sizeof(*a));//4 *a是第一个元素 计算第一个元素个数.. 地址解引用得到元素 printf("%dn", sizeof(a+1));//4/8 第2个元素地址 计算地址的大小 printf("%dn", sizeof(a[1]));//4 计算第二个元素大小 printf("%dn", sizeof(&a));//4/8 虽然是数组的地址 但也是地址 sizeof(&a)计算的一个地址的大小 printf("%dn", sizeof(*&a));//16 计算数组的大小 //&a --int (*p)[4]=&a; *&相当于可以抵消 printf("%dn", sizeof(&a+1));//4/8 整个数组后的地址 printf("%dn", sizeof(&a[0]));//4/8 拆分先看a【0】 printf("%dn", sizeof(&a[0]+1));//4/8 加一第二个地址 return 0; }
**&a取出整个数组地址 +1就是跳过这个数组的地址 **
字符数组
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24int main() { char arr[] = { 'a','b','c','d','e','f' }; //printf("%dn", sizeof(arr));//6 //printf("%dn", sizeof(arr + 0));//4/8 地址大小 //printf("%dn", sizeof(*arr));//1 找到a sizeof(a)就是一个字节 //printf("%dn", sizeof(arr[1]));//1 //printf("%dn", sizeof(&arr));//4/8 //printf("%dn", sizeof(&arr+1));//4/8 //printf("%dn", sizeof(&arr[0] + 1));// 4/8 printf("%dn", strlen(arr));//随机值 内存空间很大不知道什么时候遇到 printf("%dn", strlen(arr + 0));//随机值 printf("%dn", strlen(*arr));//报错 a a的ascii值是97 strlen看待指针变量就是地址 printf("%dn", strlen(arr[1]));//报错 printf("%dn", strlen(&arr));//随机值 &arr去除是数组地址 只要穿过去就变成字符地址 printf("%dn", strlen(&arr + 1));//随机值 (-6) printf("%dn", strlen(&arr[0] + 1));//随机值 (-1) return 0; }
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28int main() { //char arr[] = "abcdef"; [a b c d e f ] //printf("%dn", sizeof(arr));//7 //printf("%dn", sizeof(arr + 0));//4/8 //printf("%dn", sizeof(*arr));//1 //printf("%dn", sizeof(arr[1]));//1 //printf("%dn", sizeof(&arr));//4/8 //printf("%dn", sizeof(&arr + 1));// 4/8 //printf("%dn", sizeof(&arr[0] + 1));// 4/8 char arr[] = "abcdef"; printf("%dn", strlen(arr));//6 printf("%dn", strlen(arr + 0));//6 printf("%dn", strlen(*arr));//err printf("%dn", strlen(arr[1]));//err printf("%dn", strlen(&arr));//6 printf("%dn", strlen(&arr + 1));//随机值 printf("%dn", strlen(&arr[0] + 1)); //5 }
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26int main() { //char *p = "abcdef"; [a b c d e f ] //printf("%dn", sizeof(p));//4/8 //printf("%dn", sizeof(p + 1));//4/8 //printf("%dn", sizeof(*p));//1 //printf("%dn", sizeof(p[0]));//1 p[0]->*(p+0) //printf("%dn", sizeof(&p));//4/8 取地址p的地址也是地址 //printf("%dn", sizeof(&p + 1));//4/8 因为&的是p的地址 所以还在p单独分配的那块空间内 //printf("%dn", sizeof(&p[0] + 1));// 4/8 char* p = "abcdef"; //[a b c d e f ] printf("%dn", strlen(p));//6 printf("%dn", strlen(p + 1));//5 printf("%dn", strlen(*p));//err a printf("%dn", strlen(p[0]));//err printf("%dn", strlen(&p));// 随机值 printf("%dn", strlen(&p + 1));//随机值 printf("%dn", strlen(&p[0] + 1));// 5 }
图解 p里存放a的地址
最后
以上就是甜甜楼房最近收集整理的关于C语言 指针进阶7 8最终篇 模仿qsort函数实现冒泡排序通用算法 指针题模仿qsort函数实现冒泡排序通用算法数组名字符数组的全部内容,更多相关C语言内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复