指针和函数

指针和函数

1、形参改变不了实参的值:图1
在这里插入图片描述
图1

2、通过地址传递可以改变实参的值:图2
在这里插入图片描述
注意:在图1与图2 在定义函数参数中 a,b前 星号 * 的有无 说明传递的是 实参的地址与实参的值

2、函数参数中如果有数组 都会转化为指针 sizeof(数据类型) 所以求出来的值不作为循环的值使用
在这里插入图片描述
打印结果
在这里插入图片描述
注意:数组作为函数参数可以退化为指针(图3)
在传递数组时需要加上数组的个数
在这里插入图片描述
图3
3、两种方式求出字符串长度 (图4)
①利用函数strlen();
②通过while循环遍历字符串直至遇到字符串结果\0结束,遍历中定义一个整型变量i,进行记录循环次数,同时也是字符串长度;
在这里插入图片描述
图4

4、指针作为返回值
①字符串数组 存放在栈区:图5
在这里插入图片描述
图5
②字符串常量 会在程序运行时 放在常量区 不能被修改 可以读取 程序结束时会被销毁:图6
在这里插入图片描述图6
③保证指针地址对应的值是有内容的:图7
在这里插入图片描述
图7

5、strstr例子:
条件:①两个匹配的字符串,必须完全匹配,匹配个数 = 字符串长度
②如果匹配一个字符串,需要记录被匹配字符串地址
③如果匹配一半为成功 回到记录被匹配字符串地址+1
④如果匹配中的被匹配字符串的结束 匹配个数 不等于 字符串长度

6、指针和字符串
①*p改变字符串中的值
在这里插入图片描述
②字符串与指针在程序中打印的值:
在这里插入图片描述
③字符串常量 是一个常量的数组 可以读取字符和字符串 但是不能修改
在这里插入图片描述
④栈区
在这里插入图片描述
⑤常量区
在这里插入图片描述
7、指针小结
在这里插入图片描述
二级指针小结
在这里插入图片描述
注意:不是所有的二级之指针都能当作二维数组来操作
所有的二维数组都能当作二维指针来使用

8、字符串排序的三种实现方法:
在这里插入图片描述
循环优化
定义一个int类型 初始化为1;
在第二层循环的交换语句的开始 将定义的int类型的flag 赋值为零,开始内层循环结束,判断flag是否为零,如果为零直接return,
否则在外层循环再将flag赋值为1,再次进行内循环,直至执行flag判断的语句;
在这里插入图片描述练习:手写strstr函数

//#define _CRT_SECURE_NO_WARNINGS
//#include<stdio.h>
//#include<string.h>
//#include<stdlib.h>
//
///*
//1、两个匹配的字符串 必须完全匹配  匹配个数 = 字符串长度
//2、如果配匹一个字符串,需要记录被匹配字符串地址
//3、如果匹配一半未成功 回到记录被匹配字符串地址+1
//4、如果匹配的被匹配字符串的结尾  匹配个数 不等于 字符串长度
//*/
//
//char * mystrstr(char * dest, char *src)
//{
//	int i = 0;
//	int j = 0;
//
//	//匹配个数
//	int count = 0;
//	int len = strlen(src);
//	char * p = NULL;
//	while (dest[i] != '\0')
//	{
//		//if (dest[i] == src[i]);
//
//		while (dest[i] == src[j] && dest[i])//匹配个数 = 字符串长度 l l     l o
//		{
//			if (!count)
//				//如果匹配成功一个字符  需要记录位置
//				p = &dest[i];
//			count++;
//			i++; 
//			j++;
//			//匹配成功
//			if (count == len)
//			{
//				return p;
//			}
//
//		}
//
//		//发生改变的值  i  j  count  p
//		if (count < len)
//		{
//			i = i - count;
//			j = 0;
//			//count 归 0
//			count = 0;
//			//continue;
//		}
//
//		i++;
//	}
//
//	//返回值结果
//	//return p;
//	return NULL;
//}
//
//int main()
//{
//
//	char *p = mystrstr("helllllo", "lllllo");
//	printf("%s\n", p);
//
//	system("pause");
//	return EXIT_SUCCESS;
//}
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

/*
1、两个匹配的字符串 必须完全匹配  匹配个数 = 字符串长度
2、如果配匹一个字符串,需要记录被匹配字符串地址
3、如果匹配一半未成功 回到记录被匹配字符串地址+1
4、如果匹配的被匹配字符串的结尾  匹配个数 不等于 字符串长度
*/

char * mystrstr(char * dest, char *src)
{
	char * p = NULL;
	char * temp = src;
	while (*dest)//
	{
		p = dest;
		while (*dest == *temp && *dest)//匹配个数 = 字符串长度 l l     l o
		{
			dest++;
			temp++;
		}
		if (!*temp)//\0
			//if (*temp=='\0')//\0
			return p;
		else
			temp = src;
		dest = p;
		dest++;
	}

	//返回值结果
	//return p;
	return NULL;
}

int main07()
{

	char *p = mystrstr("helllo", "lol");
	printf("%s\n", p);

	system("pause");
	return EXIT_SUCCESS;
}

练习:手写strlen函数

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void mystrcat(char * arr,char * s1)
{
	//while (*arr)
	//	arr++;
	//while (*arr++ = *s1++);
	while (*arr)
		arr++;
	while (*s1)
	{
		*arr = *s1;
		arr++;
		s1++;
	}
	*arr = '\0';
}
int main09()
{
	char arr[100] = "hello";
	char * s1 = "world";
	mystrcat(arr, s1);
	printf("%s\n", arr);



	//system("pause");
	return EXIT_SUCCESS;
}

练习:去空字符串

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char *  removeSpace(char * arr)
{
	//char temp[100];
	char * start = arr;
	//字符串有效长度需要-1为数组元素下标
	char * end = arr + strlen(arr)-1;
	while (*end ==' ' && end > start)
	{
		end--;
	}
	*(end+1) = '\0';
	while (*start == ' ' && start < end)
	{
		start++;
	}
	return start;

}

int main01()
{

	//char arr[] = "       你好         ";

	//char * p= removeSpace(arr);
	//printf("%s\n", p);


	//printf("%d\n", sizeof(int **));
	//printf("%d\n", sizeof(int ***));
	//printf("%d\n", sizeof(void *));


	float arr[10] = {1,2,3};
	//printf("%p\n", &arr[0]);
	//printf("%p\n", &arr[0]+1);
	//&arr[0] + 1;
	char *p = arr;
	*(float *)p = 1000;
	printf("%f\n", arr[0]);
	//*((int *)p + 1) = 2000;
	//printf("%d\n", arr[2]);
	//int *p1 = arr;
	//int *p2 = &arr[1];
	//int len = p2 - p1;
	//printf("%d\n", len);

	//system("pause");
	return EXIT_SUCCESS;
}

练习:字符串排序

//#define _CRT_SECURE_NO_WARNINGS
//#include<stdio.h>
//#include<string.h>
//#include<stdlib.h>
//
//
字符串排序  根据字符串首字符 按照a-z的顺序排序
student tree new bee  bee new student tree
//
//void bubble(char ** arr,int len)
//{
//	for (int i = 0; i < len - 1; i++)
//	{
//		for (int j = 0; j < len - i - 1; j++)
//		{
//			//比对两个字符串的首字母
//			//1、指针判断
//			//if (**(arr + j) < **(arr + j + 1))
//			//{
//			//	char * temp = *(arr+j);
//			//	*(arr + j) = *(arr + j + 1);
//			//	*(arr + j + 1) = temp;
//			//}
//			//2、数组判断
//			//if (arr[j][0] > arr[j+1][0])
//			//{
//			//	char * temp = arr[j];
//			//	arr[j] = arr[j+1];
//			//	arr[j + 1] = temp;
//			//}
//			//3、混合判断
//			if (*arr[j] > *arr[j + 1])
//			{
//				char * temp = arr[j];
//				arr[j] = arr[j+1];
//				arr[j + 1] = temp;
//			}
//		}
//	}
//}
//
//int main()
//{
//	char *arr[] = { "cshdf", "ehsdhf", "bjhdjfhd","abee" };
//
//	/*arr[0][0]
//	student //arr[0]
//	tree//arr[1]
//	new
//	bee
//	*/
//	bubble(arr, 4);
//
//	for (int i = 0; i < 4; i++)
//	{
//		printf("%s\n", arr[i]);
//	}
//	//printf("%c\n", arr[0][0]);
//	//printf("%c\n", arr[1][0]);
//	//printf("%c\n", arr[2][0]);
//	//printf("%c\n", arr[3][0]);
//
//
//	system("pause");
//	return EXIT_SUCCESS;
//}

冒泡排序的优化算法:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void bubble(int *arr, int len)
{
	int flag = 1;
	for (int i = 0; i < len - 1; i++)
	{
		for (int j = 0; j < len - i - 1; j++)
		{
			if (arr[j] < arr[j + 1])
			{
				flag = 0;
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
		if (flag)
			return;
		flag = 1;
	}
}
int main()
{
	int arr[] = { 1,3,5,8,9,2,7,4,6,0 };
	bubble(arr,10);

	for (int i = 0; i < 10; i++)
	{
		printf("%d\n", arr[i]);
	}
	//system("pause");
	return EXIT_SUCCESS;
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值