指针和函数
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;
}