学习目标:
对C语言有进一步了解
学习内容:
1:函数是什么
可理解为子程序;具有相对独立性;一般有输入参数和返回值,完成某一操作,可不返回。
2:函数的分类
(a):库函数
(b):自定义函数
如:strcpy:char* strcpy(char* destination,const char* source)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "xxxxxxxxxx";
char arr2[] = "hello";
strcpy(arr1, arr2);//理解为:数组名为数组首元素地址,从这往后读至\0
printf("%s\n", arr1);//%s:读(打)至\0
char* ret = strcpy(arr1, arr2);
printf("%s\n", ret);//与上述arr1起打一致,因为ret与arr1同指针
return 0;
}
又如memset:void* memset(void* ptr,int value ,size_t num);//void*为万能指针
上述代码的结果:两行hello
注意:size_t以字节为单位,且可为变量,有具体的值即可。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "hello bit";
char* ret=memset(arr,'x',5);//arr起换,往后5个字节内的东西换为'x'
printf("%s\n", ret);//ret起打
return 0;
}
上述代码的结果为:xxxxx bit
3:自定义函数
练习:写一个函数:实现两个数的交换
上述代码确实没问题,但是只是传值调用,要知道形参和实参占有不同的地址,对形参中的x,y作修改并不能影响实参的a,b所以打印时显示并没有实现a,b值得交换。如何修改?(传址)
4:函数的参数:
(a):实参:真实传给函数的参数;常包含:常量、变量、表达式、函数(都必须要要有确定的值,以便于传给形参) 。
(b):形参:函数名后括号中的变量,只有函数被调用时才会实例化(分配内存单元),且当函数调用结束后,自动销毁,因此形参只在函数中有效。
5:函数的调用:
前述:传值调用、传址调用。
练习:写一个函数:实现整型有序数组的二分法查找:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int binary_search(int* s, int x, int y)
{
int left = 0;
int right = y - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (s[mid]>x )//理解为s[0+mid],s和arr同为main()函数中数组的首元素地址
{
right = mid - 1;
}
else if (s[mid] < x)
{
left = mid + 1;
}
else
{
return mid;
}
}
return -1;
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int sz = sizeof(arr) / sizeof(arr[0]);
int k = 7;//被查找的数
int ret=binary_search(arr, k, sz);
if (-1 == ret)
{
printf("找不到\n");
}
else
{
printf("找到了,其下标为:%d\n", ret);
}
return 0;
}
运行结果:
上述代码要注意的几个点:
①:int* s:接受的是arr,即数组首元素地址,再通过s[0+mid]来遍历数组所有元素。
②:由于int* s仅接受数组首元素地址,它并不知道往后到底有多少个元素,或者说往后还能加多少个字节。故sz在函数中是不可求的,只能在main函数中求完了,再传过来用。
6:函数的嵌套调用和链式访问:
note:函数的嵌套定义是不对的!!!!比如:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
void test()
{
printf("hehe\n");
}
return 0;
}
链式访问:把一个函数的返回值作为另一个函数的参数。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[20] = "xxxxxxxxxxxx";
char arr2[20] = "hello";
printf("%s\n", strcpy(arr1, arr2));//strcpy返回的是destination的地址,从这往后打印字符串即可,至'\0'
return 0;
}
结果:
再一题:printf("%d",printf("%d",printf("%d",43)))的打印结果是什么?
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
printf("%d", printf("%d", printf("%d", 43)));//printf()函数返回的是打印字符的个数
return 0;
}
其结果为:
学习时间:
2021.9.14-2021.9.15
学习产出:
1、 技术笔记 2 遍
2、CSDN 技术博客 1 篇
3、 gitee