指针与函数、指针函数、函数指针-创新互联

C语言入门系列 - 指针与函数、指针函数、函数指针

第一节 C 语言基础以及基本数据类型
第二节 C 语言运算符
第三节 C 语言控制语句
第四节 C 语言自定义函数
第五节 C 语言修饰变量的关键字
第六节 C 语言构造数据类型–数组
第七节 C 语言字符串
第八节 C 语言指针
第九节 指针与函数、指针函数、函数指针
第十节 数组与指针、二级指针&NULL&void 指针

创新互联公司专注于企业网络营销推广、网站重做改版、柘荣网站定制设计、自适应品牌网站建设、HTML5建站商城开发、集团公司官网建设、外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为柘荣等各大城市提供网站开发制作服务。

指针与函数
  • C语言入门系列 - 指针与函数、指针函数、函数指针
  • 指针与函数介绍
  • 一、指针形参类型
  • 二、指针函数
  • 三、函数指针
  • 总结


指针与函数介绍

指针在函数里面的使用。
函数的哪个地方?
函数三要素: 返回值类型  (函数指针)
       形参:形参类型
       函数名:指针指向函数,直接使用指针名调用函数  (指针函数)


一、指针形参类型

指针作为形参类型使用,必须传递地址 – 传递数组的地址进去。
  // 编译器会自动将 char str[] – 转换成 char *s
  // int nums[] – 转换成 int *nums – sizeof
数组传递到函数里面去的时候,传递的是首元素的地址。

函数调用:
  给形参开启空间 – 如果开辟和实参同样的空间会浪费内存大量的空间,尤其是数组中元素比较多的时候。
  如果设计成传递首地址的形式,只需要开启一个 4/8 字节大小的空间即可,然后通
过地址的偏移可以获取到所有的数据。

解决在函数中获取数组的长度? – 传递一个长度值进入函数 —所有对的数组都适用。
  数组传递的时候传递的只是首元素的地址,如果想在函数中获取数组长度,可以统一将数组长度传入到函数。
  如果传递时字符串,那么可以不传递长度,因为字符串有一个结束符号’\0’,z 在函数内部 strlen()、 while和‘\0’进行自定义的计数,都可以获取到数组的长度。

使用函数打印数组以及求数字的大最小值。(函数只能返回一个值,所以又把求大最小值分成两个函数)

#includevoid pri(int *arr,int len){int i;
	for(i=0; iprintf("%d ",*(arr+i));
	}
	printf("\n");
}
int max(int *arr,int len){int i,max = *arr;
	for(i=1; iif(max< *(arr+i)){	max = *(arr+i);
		}
	}
	return max;
}
int min(int *arr,int len){int i,mix = *arr;
	for(i=1; iif(mix >*(arr+i)){	mix = *(arr+i);
		}
	}
	return mix;
}
int main()
{int arr[6]={1,2,3,4,5,6};
	int len = sizeof(arr)/sizeof(arr[0]);
	pri(arr,len);
	int max1 = max(arr,len);
	int min1 = min(arr,len);
	printf("数组中大值:%d ,最小值:%d",max1,min1);
	return 0;
}

使用函数,求目标字符串中的每个第一次出现的位置,并发挥其地址。

#include//在字符串中查找某个字符第一次出现的位置
//2、定义函数返回值类型,以及用于接收的形参 
char *myStrchr(char *str,char ch){int i = 0;
	//3、如果str字符串不为空,则进入循环比较。 
	while(*(str+i) != '\0'){//4、判断当前字符串的下标是否与字符相同,是则返回下标,否则继续。 
		if(*(str+i) == ch){	return str+i;
		}
		i++;
	}
	//5、当字符串查找完了都没有相应字符,则返回空 
	return ;
}

int main()
{char str[] = "abc123def";
	char ch = '3';
	//1、定义函数需要的形参,接受返回值类型 
	char *p = myStrchr(str,ch);
	//6、从接收到的地址开始输出
	printf("%s",p);		//3def
	return 0;
}
二、指针函数

首先这是一个函数,返回值类型是指针。返回的是一个地址值。
int * sum(a,b);

代码如下(示例):
注意事项,不要返回局部变量的地址。不然函数结束,函数的局部变量也会销毁。

#include#includechar *maxString(char *s1,char *s2)
{// 两个字符串的对比可以使用库函数 strcmp 引入头文件 string.h
	// strcmp 用法:strcmp(s1,s2); --调用后的返回值:-1 s2大,返回s2;1 s1大,返回s1;0,随便返回一个
	if(strcmp(s1,s2) == -1)
	{return s2;
	}else{return s1;
	}
}
int main()
{char str1[] = "hello";
	char str2[] = "hi";
	char *res = maxString(str1,str2);
	printf("%s",res);	//%s从输入地址开始逐个打印,知道遇到结束符‘\0’
	return 0;
}
三、函数指针

首先这是一个指针,指针指向函数,通过指针去调用函数。
  第一步:定义一个指针
  第二步:将指针指向函数
  第三步:通过指针调用函数

1、定义一个指针:指向对象的类型 *指针名;
  指向对象的类型 : 函数类型
  函数  ---- 返回值类型 函数名(形参列表){}
  函数类型 除了函数名剩下的不跟就是它的类型
  int add(int a,int b)
  {
   return a + b;
  }
  函数类型: int (int a,int b); 或者 int(int , int);
  (*p) — *是指针的标记,p 变量用接收函数的地址 。 函数里面函数名就是函数的首地址

*int (p)(int a,int b); ----  这里的*代表指针的标记

2、将指针指向函数
p = add;

3、通过指针调用函数
  调用需要获取到对应的代码段
int res = (*p)(3,4); – *这里的星号代表取代码段
printf(“%d”,res);
使用场景:一般函数指针用于将一个函数传递到另外一个函数中调用 — 接口函数

求数组大值的函数,将这个函数传递到 test 里面执
代码如下(示例):

int max(int *arr,int n)
{// ....... 
}
void test(int (*p)(int *arr,int n))
{int a[6] = {2,90,4,6,20,50};
	int len = sizeof(a) / sizeof(int);
	int m = (*p)(a,len);
	printf(“%d”,m);
}
main
{test(max);
}

void (* p)(int m);
// p – 函数指针的名字
// p 的类型 – void (*)(int m);
// p 指向的对象的类型 ---- void (int m)

#includeint status = 1;
void led(void)
{// if(status == 1){// printf("点灯\n");
	// }else{// printf("没有电\n");
	// }
	printf("点灯\n");
}
void fan(void)
{// if(status == 1) {// printf("启动风扇\n");
	// }else{// printf("没有电\n");
	// }
	printf("启动风扇\n");
}
// 实现这两个功能之前都必须要确保上电? --
// 接口函数 -- 传递给我什么功能函数,函数然后检验完校验通过去执行相依内的函数功能
// -- 如果校验不通过就 打印 没有电
void entrance(void (*p)(void))
{if(status == 1)
	{(*p)();
	}else{printf("没有电\n");
	}
}
int main()
{entrance(led);
	return 0;
}

总结

指针与函数
 作为形参类型 – 数组–或者地址
 作为返回值类型 – 指针函数 返回一个地址,(注意不要返回局部变量的地址) char *maxString(char *s1,char *s2);
 直接指向一个函数 ,调用函数–函数指针 函数类型 – 除了函数名剩下的部分,使用 (*指针名)取代函数名的位置,就可以声明函数指针。
 int add(int a,int b)
 {
  return a+ b;
 }
 int (*p)(int a,int b);
 p = add;
 int res = (*p)(3,4); // add(3,4)
一般用于函数作为参数传递到另外一个函数里面调用 – 接口函数 – 回调函

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享标题:指针与函数、指针函数、函数指针-创新互联
URL地址:http://pwwzsj.com/article/docepj.html