【C语言基础】 第七天 | 知识点总结

在这里插入图片描述

栈 帧:
		当函数调用时,系统会在 stack 空间上申请一块内存区域,用来供函数调用,主要存放 形参 和 局部变量(定义在函数内部)。

		当函数调用结束,这块内存区域自动被释放(消失)。
传值和传址:
		传值:函数调用期间,实参将自己的值,拷贝一份给形参。 

		传址:函数调用期间,实参将地址值,拷贝一份给形参。 【重点】

			(地址值 --》 在swap函数栈帧内部,修改了main函数栈帧内部的局部变量值)
指针做函数参数:
		int swap2(int *a, int *b);

		int swap2(char *a, char *b);

		调用时,传有效的地址值。

数组做函数参数:
		void BubbleSort(int arr[10])  ==   void BubbleSort(int arr[])  == void BubbleSort(int *arr) 

		传递不再是整个数组,而是数组的首地址(一个指针)。

		所以,当整型数组做函数参数时,我们通常在函数定义中,封装2个参数。一个表数组首地址,一个表元素个数。
指针做函数返回值:
		int *test_func(int a, int b);

		指针做函数返回值,不能返回【局部变量的地址值】。
数组做函数返回值:
		C语言,不允许!!!!  只能写成指针形式。
指针和字符串:
	1char str1[] = {'h', 'i', '\0'};			变量,可读可写

		char str2[] = "hi";				变量,可读可写

		char *str3 = "hi";				常量,只读

			str3变量中,存储的是字符串常量“hi”中首个字符‘h’的地址值。


			str3[1] = 'H';	// 错误!!

		char *str4 = {'h', 'i', '\0'};  // 错误!!!

	2)
		当字符串(字符数组), 做函数参数时, 不需要提供2个参数。 因为每个字符串都有 '\0'
练习:比较两个字符串: strcmp();实现
		比较 str1 和 str2, 如果相同返回0, 不同则依次比较ASCII码,str1 > str2 返回1,否则返回-1

数组方式:

int mystrcmp(char *str1, char *str2)
{
	int i = 0;

	while (str1[i] == str2[i])   // *(str1+i) == *(str2+i)
	{
		if (str1[i] == '\0')
		{
			return 0;			// 2字符串一样。
		}
		i++;
	}
	return str1[i] > str2[i] ? 1 : -1;
}

指针方式:

int mystrcmp2(char *str1, char *str2)
{
	while (*str1 == *str2)   // *(str1+i) == *(str2+i)
	{
		if (*str1 == '\0')
		{
			return 0;			// 2字符串一样。
		}
		str1++;
		str2++;
	}
	return *str1 > *str2 ? 1 : -1;
}

练习:字符串拷贝:
//数组版本
void mystrcpy(char *src, char *dst)
{
	int i = 0;
	while (src[i] != 0)  // src[i] == *(src+i)
	{
		dst[i] = src[i];
		i++;
	}
	dst[i] = '\0';
}

//指针版
void mystrcpy2(char *src, char *dst)
{
	while (*src != '\0')  // src[i] == *(src+i)
	{
		*dst = *src;
		src++;
		dst++;
	}
	*dst = '\0';
}
练习:在字符串中查找字符出现的位置:
char *myStrch(char *str, char ch)
{
	while (*str)
	{
		if (*str == ch)
		{
			return str;
		}
		str++;
	}
	return NULL;
}
// hellowrld --- 'o'
char *myStrch2(char *str, char ch)
{
	int i = 0;
	while (str[i])
	{
		if (str[i] == ch)
		{
			return &str[i];  
		}
		i++;
	}
	return NULL;
}
练 习:字符串去空格。
void str_no_space(char *src, char *dst)
{
	int i = 0;   // 遍历字符串src
	int j = 0;	 // 记录dst存储位置
	while (src[i] != 0)
	{
		if (src[i] != ' ')
		{
			dst[j] = src[i];
			j++;
		}
		i++;
	}
	dst[j] = '\0';
}
// 指针版
void str_no_space2(char *src, char *dst)
{
	while (*src != 0)
	{
		if (*src != ' ')
		{
			*dst = *src;
			dst++;
		}
		src++;
	}
	*dst = '\0';
}

带参数的main函数:
	无参main函数: 	int main(void) == int main()

	带参数的main函数: int main(int argc, char *argv[]) == int main(int argc, char **argv)1:表示给main函数传递的参数的总个数。

		参2:是一个数组!数组的每一个元素都是字符串 char * 

	测试1: 
		命令行中的中,使用gcc编译生成 可执行文件,如: test.exe

		test.exe abc xyz zhangsan nichousha 

		-->

		argc --- 5
		test.exe -- argv[0]
		abc -- argv[1]
		xyz -- argv[2]
		zhangsan -- argv[3]
		nichousha -- argv[4]

	测试2:

		在VS中。项目名称上 --》右键--》属性--》调试--》命令行参数 --》将 test.exe abc xyz zhangsan nichousha 写入。

		-->

		argc --- 5
		test.exe -- argv[0]
		abc -- argv[1]
		xyz -- argv[2]
		zhangsan -- argv[3]
		nichousha -- argv[4]
str 中 substr 出现次数:
	strstr函数: 在 str中,找substr出现的位置。

	char *strstr(char *str, char *substr)   -- #include <string.h>1: 原串

		参2: 子串

		返回值: 子串在原串中的位置。(地址值);

			 如果没有: NULL

实 现:
int str_times(char *str, char *substr)
{
	int count = 0;
	char *p = strstr(str, substr);  // "llollollo"

	while (p != NULL)
	{
		count++;
		p += strlen(substr);	// p = p+strlen(substr) --> "llollo"
		p = strstr(p, substr);	// 返回: "llo"
	}
	return count;
}


更多有关于Linux C++后台开发的学习分享,感兴趣的朋友们可以关注我的个人公众号
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值