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;
}