嗨翻C语言——高级函数(7)

1、假设要声明一个int类型指针,只需要在int后加入*号,

int *a;

C语言中没有函数类型,所以不能用

fuction *f;

2、函数的类型不止一种,例如返回类型或形参列表,函数的类型是由这些东西的组合定义的。
3、char是一个指针,通常用来指向字符串。
4、函数指针:
返回类型(* 指针变量)(参数类型)

char***name_fn)(char*,int)

(names_fn)是声明的变量名**
5、函数指针是指针,但是在调用函数时对于*可加可不加,可以把代码中match(ADS[i])换成(match)(ADS[i])
6、C标准库含有qsort()函数,反复比较两个数据的大小,如果顺序颠倒,计算机会交换它们。它接收两个void
,也就是两个void函数,void指针可以保存任何类型数据的地址,但使用前必须将其转换为具体类型。

qsort(void *array,size_t length,size_t item_size,int (*compar)(const void *,const void *));

参数依次为:数组指针,数组长度,数组中每个元素的长度,用来比较数组中两项数据大小的函数指针
7、字符串数组排序的比较器函数使用char**:字符串数组中的每一项都是字符指针,当qsort()调用比较器函数时,会发送两个指向数组元素的指针,也急速说比较器函数接收到的是指向字符指针的指针。
8、创建一个与回复类型一一对应的函数指针数组。

void (*replies[])(response)={
    
    dump,second_chance,marrage};

返回类型(*指针变量)(参数类型)
9、参数数量可变的函数被称为可变参数函数。
10、什么是预处理?
预处理器在编译阶段之前运行,他会做很多事情,包括把头文件包含进代码。
11、va_end(),va_list(),va_arg()和va_start()虽然是函数的样子,但是它们是宏。可以用va_start()、va_arg()和va_end()控制va_list。
12、接收数量可变参数的函数叫可变参数函数。
13、为了创建柯柏年参数函数,需要包含stdarg.h头文件。
代码一:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>


/*
int go_to_warp_speed(int speed)
{
	dilithium_crystals(ENGAGE);
	warp = speed;
	reactor_core(c,125000*speed,PI);
	cluthc(ENGAGE);
	brake(DISENGAGE);
	return 0;
}
*/

int sports_no_bieber(char *s)
{
    
    
	return strstr(s,"sports") && !strstr(s,"bieber");
}

int sports_or_workout(char *s)
{
    
    
	return strstr(s,"sports") || strstr(s,"workout");
}

int ns_theater(char *s)
{
    
    
	return strstr(s,"NS") && strstr(s,"theater");
}

int arts_theater_or_dining(char *s)
{
    
    
	return strstr(s,"arts")||strstr(s,"theater")||strstr(s,"dining");
}

void find(int(*match)(char*))
{
    
    
	int NUM_ADS = 7;
	char *ADS[] = {
    
    
	"William:SBM GSOH likes sports,TV,dining",
	"Matt:SWM NS likes art,movies,theater",
	"Luis:SLM ND likes books,theater,art",
	"Mike:DWM DS likes trucks,sports and bieber",
	"Peter:SAM likes chess,working out and art",
	"Josh:SJM likes sports,movies and theater",
	"Jed:DBM likes theater,books and dining"};
	int i;
	puts("Search results:");
	puts("-------------------------");
	for(i=0;i<NUM_ADS;i++){
    
    
		//if(strstr(ADS[i],"sports")&&!strstr(ADS[i],"bieber")){
    
    
		//if*call-the-match-function(ADS[i])){
    
    
		if(match(ADS[i])){
    
    
			printf("%s\n",ADS[i]);
		}
	}
	puts("-------------------------");
}

int main()
{
    
    

	find(sports_no_bieber);
	find(sports_or_workout);
	find(ns_theater);
	find(arts_theater_or_dining);
	return 0;
}

/*
int (*warp_fn)(int);
warp_fn = go_to_warp_speed;
warp_fn(4);

char** (*names_fn)(char*,int);
names_fn = album_names;
char** results = names_fn("Sacha Distel",1972);

*/

代码二:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
/*
qsort(void *array,
      size_t length,
	  size_t item_size,
	  int (*compar)(const void *,const void*));
*/

//升序排列整型得分
int compare_scores(const void* score_a,const void* score_b)
{
    
    
	int a = *(int*)score_a;
	int b = *(int*)score_b;
	return a-b;
}

//降序
int compare_scores_desc(const void* score_a,const void* score_b)
{
    
    
	int a = *(int*)score_a;
	int b = *(int*)score_b;
	return b-a;
}

//按面积从小到大排列矩形
typedef struct{
    
    
	int width;
	int height;
}rectangle;

int compare_areas(const void* a,const void* b)
{
    
    
	rectangle* ra = (rectangle*)a;
	rectangle* rb = (rectangle*)b;
	int area_a = (ra->width * ra->height);
	int area_b = (rb->width * rb->height);
	return area_a-area_b;
}

//按字母序排列名字,区分大小写
int compare_names(const void* a,const void* b)
{
    
    
	char** sa = (char**)a;
	char** sb = (char**)b;
	return strcmp(*sa,*sb);
}

//优化面积
int compare_areas_desc(const void* a,const void* b)
{
    
    
	return compare_areas(b,a);
}

//优化字母逆序
int compare_names_desc(const void* a,const void* b)
{
    
    
	return compare_names(b,a);
}

int main()
{
    
    
	int scores[]={
    
    543,323,32,554,11,3,112};
	int i;
	qsort(scores,7,sizeof(int),compare_scores_desc);
	puts("These are the scores in order:");
	for(i=0;i<7;i++){
    
    
		printf("Score = %i\n",scores[i]);
	}
	char *names[] ={
    
    "Karen","Mark","Breet","Molly"};
	qsort(names,4,sizeof(char*),compare_names);
	puts("These are the names in order:");
	for(i=0;i<4;i++)
	{
    
    
		printf("%s\n",names[i]);
	}
	return 0;
}

	

代码三:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

enum response_type{
    
    DUMP,SECOND_CHANCE,MARRIAGE};
typedef struct{
    
    
	char *name;
	enum response_type type;   //在每条回复数据中记录回复类型
}response;

void dump(response r)
{
    
    
	printf("Dear %s,\n",r.name);
	puts("Unfortunately your last date contacted us to");
	puts("say that they will not be seeing you again");
}

void second_chance(response r)
{
    
    
	printf("Dear %s,\n",r.name);
	puts("Good news:your last date has asked us to");
	puts("arrange another meeting.Please call ASAP.");
}

void marriage(response r)
{
    
    
	printf("Dear %s,\n",r.name);
	puts("Congratulations!Your last date has contacted");
	puts("us with a proposal of marriage.");
}

void (*replies[])(response)={
    
    dump,second_chance,marriage};

int main()
{
    
    
	response r[] ={
    
    {
    
    "Mike",DUMP},{
    
    "Luis",SECOND_CHANCE},{
    
    "Matt",SECOND_CHANCE},{
    
    "William",MARRIAGE}};
	int i;
	for(i=0;i<4;i++){
    
    
		/*	switch(r[i].type){
			case DUMP:
				dump(r[i]);
				break;
			case SECOND_CHANCE:
				second_chance(r[i]);
				break;
			default:
				marriage(r[i]);
		}*/
		(replies[r[i].type])(r[i]);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_46504000/article/details/129245181