一、字符串操作函数
自制函数
字符串复制
char *Strcpy(char *dest, const char *src) { char *ret = dest; while ((*src) != '\0') { *dest = *src; ++dest; ++src; } *dest = '\0'; return ret; }//将src的前n个字符拷贝到dest中 char *Strncpy(char *dest, const char *src, int n) { char *ret = dest; while ((*src) != '\0' && n ) { *dest = *src; ++dest; ++src; --n; } while (n != 0) { *dest = '\0'; --n; ++dest; } return ret; }字符串拼接
char *Strcat(char *dest, const char *src) { char *ret = dest; while (*dest != '\0') { ++dest; } while (*src != '\0') { *dest = *src; ++dest; ++src; } *dest = '\0'; return ret; }//将src的前n个字符拼接到dest中 char *Strncat(char *dest, const char *src, int n) { char *ret = dest; while (*dest != '\0') { ++dest; } while (*src != '\0' && n) { *dest = *src; ++dest; ++src; --n; } while (n != 0) { *dest = '\n'; ++dest; --n; } return ret; }字符串比较
int Strcmp(const char *s1, const char *s2) { int ret = 0; while (*s1==*s2 && *s1!='\0' && *s2!='\0') { ++s1; ++s2; } ret = *s1-*s2; return ret; }//将s1和s2中的前n个字符进行比较 int Strncmp(const char *s1, const char *s2, int n) { int ret = 0; while (*s1==*s2 && *s1!='\0' && *s2!='\0' && n-1>0) { ++s1; ++s2; --n; } ret = *s1-*s2; return ret; }二、指针操作二维数组
整型
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
p = &a[0];//a[0]是首元素,a[0]的类型是int[4]这种数据类型
正确写法:
int (*p) [4] = &a[0];
*p <=> a[0] //*p 等价于 a[0] 这个一维数组的数组名(首元素地址 ),等价于&a[0][0] (数据类型是int * )
*p + 1 相当于加了一个 int 基类型的大小
a[i][j] <=> *(*(p+i)+j)
字符型
char s[5][10] = {"hello","world","english","china","america"};
char(*p)[10] = s;
通过指针变量p想访问到字符串 ,实际上是通过p得到字符串首元素的地址(因为字符串在内存中也是按照数组的方式存放的,获得首元素地址就可以获得到整个字符串)
char * s1 = "hello1"; //s1数据类型 char *
char * s2 = "hello2";
char * s3 = "hello3";
char * s4 = "hello4";
char* s[5]; //用来存放 s1 s2 s3 s4,指针数组,数组中元素的类型都是指针类型 char *
char **p //二级指针,保存的是 一级指针变量的地址
三、总结
今天重点学习了指针操作字符串和二维数组,在字符型二维数组中,会用到二级指针, 在编写快速排序代码的时候,要弄清楚需要的是地址还是字符串。递归结束条件应当使用地址范围,把字符串当成了判断条件,虽然编译的时候没有报错,但排序的效果并未达到。以后需要格外注意这一点,时刻保持对数据类型的清晰判断。