2021.9.15自我总结

学习目标:


对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

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值