一、字符串操作函数
可以链式调用
char *strcpy(char *dest, const char *src);
strcpy(s3,strcpy(s2,strcpy(s1,"hello")));
1、strncpy
char *strncpy(char *dest, const char *src, size_t n)功能:将src中前n个字符拷贝到dest中。
如果前n个字符中没有‘\0’,拷贝后也没有;如果n > src长度,最终要把n次拷完,补'\0'。
2、strncat
char *strncat(char *dest, const char *src, size_t n)功能:将src中前n个字符拼接到dest中。
从 dest 的'\0'位置开始拷贝,如果 n 小于 src长度 ,则拷贝n次结束,最后加\0,如果 n 大于 src长度 ,则将src拷贝完即可,最后加\0
3、strncmp
int strncmp(const char *s1, const char *s2, size_t n)功能:比较s1与s2的前n个字符。
4、memcpy
void *memcpy(void *dest, const void *src, size_t n);功能:
将src空间上n个字节的数据拷贝到dest所指向的空间
其中,n表示拷贝的字节
void * 万能指针,可以接收任意类型的地址,一般用于形参的设计
二、指针操作二维数组
1、整形二维数组
int a[3][4] = {1,2,3,4,5,6,7,8,9,10};二维数组的本质:一维数组的一维数组
int a[3][4] ==> int[4] a[3]; 即数组a[3]的类型是int[4],故要定义一个指针指向a[3],指针类型应为int[4] * ,其正确写法为:
int (*p) [4] = &a[0];a[i][j] <==> *(*(p+i)+j)
2、字符型二维数组(栈)
存放多个字符串
char s[5][10] = {"hello","world","english","china","america"};与整型二维数组类似:
char(*p)[10] = s;通过指针变量p想访问到字符串,实际上就是要通过p得到字符串首元素的地址(因为字符串在内存中也是按照数组的方式存放的,获得首元素地址就可以获得到整个字符串)
3、字符型二维数组(字符串常量区)
不同于栈上访问,字符串常量区的访问为只读。
char * s1 = "hello1"; char * s2 = "hello2"; char * s3 = "hello3"; char * s4 = "hello4";此时,s1,s2,s3,s4的数据为char *。故数组可定义为
char *s[5];来存放s1,s2,s3,s4中各字符串的首地址。
此时,s[0] (char *)代表数组第0个元素的值,即s1的地址
&s[0] (char **)代表数组第0个元素的地址,即s[0] 这个指针变量的地址
在函数中,调用主函数中的地址数组,需要二级指针接收:
char* *p;二级数组用来保存一级指针变量的地址
此时,p存放的是一个一级指针变量的地址
*p (char *)解引用一次,取出p所指向的那个一级指针的值,等价于s[0] ,是字符串s1的首地址
**p(char**)接应用两次,先取出字符串的首地址,再取出该地址上的字符串,等价于s[0][0],即‘h’