第一节 C 语言基础以及基本数据类型
第二节 C 语言运算符
第三节 C 语言控制语句
第四节 C 语言自定义函数
第五节 C 语言修饰变量的关键字
第六节 C 语言构造数据类型–数组
第七节 C 语言字符串
第八节 C 语言指针
第九节 指针与函数、指针函数、函数指针
第十节 数组与指针、二级指针&NULL&void 指针
指针在函数里面的使用。
函数的哪个地方?
函数三要素: 返回值类型 (函数指针)
形参:形参类型
函数名:指针指向函数,直接使用指针名调用函数 (指针函数)
指针作为形参类型使用,必须传递地址 – 传递数组的地址进去。
// 编译器会自动将 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元起,快前往官网查看详情吧
售后响应及时
7×24小时客服热线数据备份
更安全、更高效、更稳定价格公道精准
项目经理精准报价不弄虚作假合作无风险
重合同讲信誉,无效全额退款