C语言进阶(3)

1.数组传参

一维数组传参的时候使用数组名,代表数组首元素的地址;函数接受时形参可以是数组形式,也可能是指针形式,数组形式比较简单数组怎么写,函数接受是就怎么接受,使用指针就要将指针类型写清楚,如下

void test1(int arr[])//void test1(int* p)
{
  ;
}
void test2(int*arr[])//void test2(int* *p)
{
  ;
}
int main()
{
  int a=0;
  int arr1[]={0};
  int* arr2[]={&a}
  test1(arr1);
  test3(arr2);
  return 0;
}

二维数组传参时使用数组名,由于数组名代表第一行的地址;因此在接参的时候使用数组要将二维数组的列表达出来,使用指针要注意数组名的实际含义,使用数组指针,如下

void test1(int arr1[2][2])//void test1(int (*p)[2])
{
  ;
}
int main()
{
  int arr1[2][2]={0};
  test1(arr1);
}

2.回调函数

回调函数就是将函数地址传递给函数,使函数在特定时候和条件用用函数地址使用函数,这就被称为函数调用。函数调用就=像一个框架,只要有合适的函数地址,就能完成一件事。

先介绍一个库函数qsort,头文件是stdlib.h,d,qsort是排序作用(可以排字符,整形等)(strcmp是比较两个字符串的,他们是将字符串一个一个字母进行比较,如abc和bgh比较先a于b比b大,所以bgh大),void qsort( void *base, size_t num, size_t width, int ( *compare )(const void *elem1, const void *elem2 ) );base是比较的首地址,num是元素个数,width是每个元素的字节大小,compare是自己写的比较函数比较两个元素的大小,如果大于返回正值,如果小于,返回负值,如果为相等返回0.函数参数就是(const void *elem1, const void *elem2 ),如下

如果我们想要降序我们就要将elem1和elem2交换顺序

我们就要注意的是void*是不能直接进行解引用需要进行强制类型转换,void*是一个强大类型,几乎可以包含任何指针类型。

对于我们之前使用的冒泡数列我们可以使用回调函数的类型进行继续优化。

先看原版

 

我们可以将其修改成与库函数qsort相似的形式,如下图

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

int int_cmp(const void* elem1, const void* elem2)
{
	return (*(int*)elem2 - *(int*)elem1);
}
void wapp(void* elem1, void* elem2, int width)
{
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char j = 0;
		j = *((char*)elem1 + i);
		*((char*)elem1 + i) = *((char*)elem2 + i);
		*((char*)elem2 + i) = j;

	}
}
void bulle_sort(void* a,int sz, int width, int(*cmp)(const void* elem1, const void* elem2))
{
	int i = 0;
	int h = 1;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (cmp((char*)a + j * width, (char*)a + (j+1)* width)>0)
			{
				//交换
				wapp((char*)a + j * width, (char*)a + (j + 1) * width, width);
			}
			h = 0;
		}
		if (h == 1)
			break;
	}
}
int main()
{
	int a[] = { 1,2,3,4,5,6,11,8,9,0 };
	int sz = sizeof(a) / sizeof(a[0]);
	/*qsort(a, sz, sizeof(a[0]), int_cmp);*/
	bulle_sort(a, sz, sizeof(a[0]), int_cmp);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

 输出结果是

上面的bulle_sort函数中将void*强制类型转换成char*以字节类型进行,可以根据width的大小来确定不同数据类型在比较时的差异。

加一个字符串比较函数,也能使用上面的函数 

  • 14
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值