C语言指针第六集

发布时间:2023年12月18日

1.模拟实现qsort函数排序整形

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void my_exc(void* p1, void* p2, int size)
{
	//逐个字节地交换
	int i = 0;
	for (i = 0; i < size; i++)
	{
		char a = *((char*)p1 + i);
		*((char*)p1 + i) = *((char*)p2 + i);
		*((char*)p2 + i) = a;
	}
}

void my_qsort(void* start, int sz, int size, int(*compare)(const void* elem1, const void* elem2))
{
	int i = 0;
	int j = 0;
	for (i = 0; i < sz; i++)
	{
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (compare((char*)start + j * size, (char*)start + (j + 1) * size) > 0)
			{
				//交换
				my_exc((char*)start + j * size, (char*)start + (j + 1) * size, size);
			}
		}
	}
}

void print_int(int arr[], int sz)//打印数组
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

int cmp_int(const void* elem1, const void* elem2)
{
	return *(int*)elem1 - *(int*)elem2;
}

int main()
{
	/*struct stu a1 = { "zhangsan",18,60 };
	struct stu a2 = { "lisi",28,98 };
	struct stu a3 = { "wangwu",25,92 };
	struct stu arr[] = { a1,a2,a3 };
	*/
	int arr[] = { 9,5,6,2,1,8,3,7,4,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	my_qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print_int(arr, sz);
	return 0;
 }

?

结构体类似

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct stu
{
	char name[20];
	int age;
	int score;
};

int cmp_age(const void* elem1, const void* elem2)
{
	struct stu* p1 = (struct stu*)elem1;
	struct stu* p2 = (struct stu*)elem2;
	return p1->age - p2->age;
}

int cmp_name(const void* elem1, const void* elem2)
{
	struct stu* p1 = (struct stu*)elem1;
	struct stu* p2 = (struct stu*)elem2;
	return strcmp(p1->name, p2->name);
}

void my_exc(void* p1, void* p2, int size)
{
	//逐个字节地交换
	int i = 0;
	for (i = 0; i < size; i++)
	{
		char a = *((char*)p1 + i);
		*((char*)p1 + i) = *((char*)p2 + i);
		*((char*)p2 + i) = a;
	}
}

void my_qsort(void* start, int sz, int size, int(*compare)(const void* elem1, const void* elem2))
{
	int i = 0;
	int j = 0;
	for (i = 0; i < sz; i++)
	{
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (compare((char*)start + j * size, (char*)start + (j + 1) * size) > 0)
			{
				//交换
				my_exc((char*)start + j * size, (char*)start + (j + 1) * size, size);
			}
		}
	}
}




int main()
{
	struct stu a1 = { "zhangsan",18,60 };
	struct stu a2 = { "lisi",28,98 };
	struct stu a3 = { "wangwu",25,92 };
	struct stu arr[] = { a1,a2,a3 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	my_qsort(arr, sz, sizeof(arr[0]), cmp_name);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%s %d %d\n", arr[i].name, arr[i].age, arr[i].score);
	}


	return 0;
 }

那个my_exc函数参数可以将void*改为char*

2.sizeof的操作数如果是类型的话,计算的是使用类型创建的变量所占内存空间的大小.
sizeof只关注占用内存空间的大小,不在乎内存中存放什么数据.

3.int arr[5] = { 0 };

arr的类型是int [5] ;

4.关于在函数内部监视主函数中的数组:

在监视那里输入数组名,元素个数即可.但要注意进入的这个函数必须要存在该数组,即该数组必须在此函数内部有一席之地

5.对printf("%d\n", sizeof(*&arr));的两种理解

int arr[4] = { 1,2,3,4 };
printf("%d\n", sizeof(*&arr));

//第一种理解:
//因为*&可以直接看作是约掉了
//所以上述代码等价于
printf("%d\n", sizeof(arr));

//第二种理解:
//&arr取出来的是整个数组的地址
//类型是int (*)[4]
//那么对他进行解引用的话,他就会向后访问一个含有4个类型为int的元素的数组所对应的内存字节大小

文章来源:https://blog.csdn.net/haipengzhou/article/details/135070962
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。