指针(5)加油吧

指针(5)

拿冒泡排序来举例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1 .qsort

void qsort (
	void* base,//base指向待排序数组的首元素的指针
	size_t num,//base指向数组中元素的个数
	size_t size,//base指向的数组中的一个元素的大小,单位是字节
	int(*cmp)(const void*,const void*)//函数指针,传递函数的地址
	);


外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

qsort的头文件是==<stdlib.h>==

测试qsort,来排序整型数据

void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

int cmp_int(const void* p1, const void* p2)
{
	if (*(int*)p1 > *(int*)p2)
	return 1;
	else if (*(int*)p1 < *(int*)p2)
		return -1;
	else
		return 0;//可以简化为return *(int*)p1-*(int*)p2
}
void test1()
{
	int arr[] = { 3,1,4,2,6,5,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print_arr(arr, sz);
}
int main() {
	test1();
	return 0;
}

补充个小知识:

怎样访问结构体的内容

struct Stu{
    char name [20];
    int age;
}
int main()
{
    struct Stu s{"maya",20};
    printf("%s %d\n",s.name,s.age);
    struct Stu *ps=&s;
    printf("%s %d\n",(*ps).name,(*ps).age);
    printf("%s &d\n",ps->name,ps->age);
    return 0;
}

结构体成员访问操作符:

. 结构体变量.成员名

-> 结构体指针->成员名

测试qsort函数排序结构体数据

struct Stu
{
	char name[20];
	int age;
};//名字是字符串,字符串比较是用strcmp函数的
int  cmp_stu_by_name(const void* p1, const void* p2)
{
	return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name);

}
void test2()
{
	struct Stu arr[] = { {"zhangsan",28},{"lisi",40},{"wangwu",12} };
	int len = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, len, sizeof(arr[0]), cmp_stu_by_name);
}
int  cmp_stu_by_age(const void* p1, const void* p2)
{
	return strcmp(((struct Stu*)p1)->age, ((struct Stu*)p2)->age);

}
void test3()
{
	struct Stu arr[] = { {"zhangsan",28},{"lisi",40},{"wangwu",12} };
	int len = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, len, sizeof(arr[0]), cmp_stu_by_age);
}
int main() {
	test2();
	test3();
	return 0;
}

补充知识:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意点:

qsort默认的顺序是升序排列

怎样实现降序呢

可以调换p1和p2顺序

2 .改造冒泡排序

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

swap交换两个元素

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

详细逻辑分析图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意点:为什么强制类型转换的是char呢,我们知道qsort函数base指向的数组中的一个元素的大小,单位是字节,如果换成int,一次跳过四个字节,力度太大了

这也是一个泛型编程,就是不管什么类型的都能处理

3 .sizeof和strlen对比

sizeof是操作符,不是函数

strlen是函数,求字符串长度,只针对字符串(字符数组),统计的是字符串中==\0==前的个数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

int main()
{
	int arr[] = { 1,2,3,4,5,0};
	//01 00 00 00 02 00 00 00 03 00 00 00 ...
    //00相当于\0,strlen遇到\0就停止计算
	printf("%zd\n", strlen(arr));

	return 0;
}

sizeof和strlen对比总结

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4 .数组和指针笔试题解析

4 .1一维数组

前情回顾:

数组名是数组首元素的地址

两个例外:

sizeof(数组名)

&(数组名)

int a[] = {1,2,3,4};
printf("%zd\n",sizeof(a));//16
//数组名a单独放在sizeof内部,a表示整个数组,计算的是整个数组的大小,单位是字节
printf("%zd\n",sizeof(a+0));//这里的a是数组名表示首元素的地址,a+0还是首元素的地址
//这里sizeof计算的是首元素地址的大小 4/8
printf("%zd\n",sizeof(*a));//4 这里的a是数组名表示首元素的地址,*a 就是首元素,就是a[0]
//*a -- *(a+0) -- a[0]
printf("%zd\n",sizeof(a+1));//这里的a是数组名表示首元素的地址,a+1是第二个元素的地址(&a[1])
//计算的是地址的大小 4/8
printf("%zd\n",sizeof(a[1]));//4
printf("%zd\n",sizeof(&a));//&a - 这里的数组名a表示整个数组,&a是整个数组的地址
//数组的地址也是地址,是地址就是 4/8 个字节的长度",sizeof(&a));
printf("%zd\n",sizeof(*&a));
//1. *&a,这里的*和&抵消了,所以sizeof(*&a) == sizeof(a) 16
//2. &a - 这是数组的地址,类型是:int(*)[4],*&a 访问的就是这个数组
printf("%zd\n",sizeof(&a+1));
//&a是数组的地址,&a+1是跳过整个数组后的那个位置的地址
//&a+1是地址,地址都是4/8个字节
printf("%zd\n",sizeof(&a[0]));//4/8
printf("%zd\n",sizeof(&a[0]+1));//第二个元素的地址 4/8

再来一组(字符数组):

int main()
{
	char arr[] = { 'a','b','c','d','e','f' };

	printf("%d\n", sizeof(arr));//6
	printf("%d\n", sizeof(arr + 0));//4/8
	printf("%d\n", sizeof(*arr));//1
	printf("%d\n", sizeof(arr[1]));//1
	printf("%d\n", sizeof(&arr));//4/8
	printf("%d\n", sizeof(&arr + 1));//4/8
	printf("%d\n", sizeof(&arr[0] + 1));//4/8

	return 0;
}

strlen

#include <string.h>

int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%zd\n", strlen(arr));//随机值
	printf("%zd\n", strlen(arr + 0));//随机值
	//printf("%zd\n", strlen(*arr));//arr是数组名表示首元素的地址
	//*arr 是首元素 -- 'a' - 97 ,传递给strlen后,strlen 会认为97就是地址,然后去访问内存
	//err -- 程序崩溃
	//printf("%zd\n", strlen(arr[1]));//'b' -98 //err
	printf("%zd\n", strlen(&arr));//随机值
	printf("%zd\n", strlen(&arr + 1));//随机值
	printf("%zd\n", strlen(&arr[0] + 1));//随机值

	return 0;
}
  • 97 ,传递给strlen后,strlen 会认为97就是地址,然后去访问内存
    //err – 程序崩溃
    //printf(“%zd\n”, strlen(arr[1]));//‘b’ -98 //err
    printf(“%zd\n”, strlen(&arr));//随机值
    printf(“%zd\n”, strlen(&arr + 1));//随机值
    printf(“%zd\n”, strlen(&arr[0] + 1));//随机值

    return 0;
    }


相关推荐

  1. 【.NET】MD5加密

    2024-05-13 01:40:04       60 阅读
  2. MD<span style='color:red;'>5</span><span style='color:red;'>加密</span>

    MD5加密

    2024-05-13 01:40:04      32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-13 01:40:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-13 01:40:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-13 01:40:04       87 阅读
  4. Python语言-面向对象

    2024-05-13 01:40:04       96 阅读

热门阅读

  1. Kubernetes(k8s)的授权(Authorization)策略解析

    2024-05-13 01:40:04       25 阅读
  2. Leetcode 3147. Taking Maximum Energy From the Mystic Dungeon

    2024-05-13 01:40:04       30 阅读
  3. 前端工程化之---git hooks

    2024-05-13 01:40:04       28 阅读
  4. Git 剔除已经纳入版本管理的文件

    2024-05-13 01:40:04       31 阅读
  5. 代码随想录:二分查找相关题目推荐(35、34)

    2024-05-13 01:40:04       31 阅读