字符串系列函数
1.输入输出
gets : gets(字符数组) ,从终端输入字符串到字符数组,但存在缓冲区溢出风险,不推荐使用。
puts : puts(字符数组) ,输出以 '\0' 结束的字符串。
2.操作处理(str系列函数)
字符串连接strcat : strcat(字符数组1, 字符数组2) ,把字符数组2的字符串连接到字符数组1后,结果存于字符数组1 。
字符串拷贝strcpy: strcpy(字符数组1, 字符串2) ,将字符串2复制到字符数组1 。 strncpy : strncpy(字符数组1, 字符串2, n) ,将字符串2的前n个字符复制到字符数组1 。
字符串比较strcmp : strcmp(字符串1, 字符串2) ,按ASCII码从左至右逐个比较两字符串,相等返回0,前者大返回正整数,后者大返回负整数。
strncmp(字符串1, 字符串2,n),比较字符串的前n个字符。
计算字符串长度strlen : strlen(字符数组) ,测量字符串实际长度(不含 '\0' )
字符串分割strtok:strtok(str,delim);str为待分割字符串 delim为包含所有分隔符的字符串。
字符串转整形:atoi();
整形转字符串:itoa();
字符串处理函数strstr :用于在一个字符串中查找另一个字符串首次出现的位置。
eg:char str[]="hello world";
char substr[]="world";
char*result=strstr(str,substr);
内存操作系列函数(mem系列)
1.memcpy使用:内存逐字节拷贝(目标二地址,目标一地址,字节数)
目标一的值拷贝给目标二
函数原型: void *memcpy(void *dest, const void *src, size_t n) 。
2.memmove使用:
函数原型: void *memmove(void *dest, const void *src, size_t n) 。
功能:与 memcpy 类似,但能处理源内存和目标内存重叠的情况。
应用场景:在可能出现内存重叠的复制场景中使用,如字符串中部分内容的移动。
eg:char arr[]="hello world"; 把arr中索引为5的位置复制到索引为3开始的位置。
3.memset 使用:
函数原型: void *memset(void *s, int c, size_t n) 。
功能:将内存区域 s 的前 n 个字节设置为指定值 c 。
应用场景:常用于初始化数组、结构体等内存区域为特定值,如将数组初始化为全零或其他特定值。
eg:memset(arr,0,n*sizeof(int)); 将数组arr的所有元素初始化为0
4.memcmp 使用:
函数原型:int memcmp(const void *s1, const void *s2, size_t n) 。
功能:比较两个内存区域 s1 和 s2 的前 n 个字节,相等返回0, s1 大于 s2 返回正整数, s1 小于 s2 返回负整数。
应用场景:用于比较内存中的数据,如比较两个数组或结构体的内容是否相同。
指针
1.指针的定义(指针是一个变量,其值为另一个变量的地址)
eg:int val=10;
int *p=&val;//p保存val的地址,p指向val;
这里,p是一个指针,int则表示指针所指向变量的数据类型。
补充:
char*pa,pb;//pa是char* pb是char
pa,pb都为char*类型--->char*pa,*pb;
eg:
#define Type char* //宏常量
Type pa,pb; //pa是char*, pb是char
typedef char* Type; //重命名
Type pa,pb; //pa,pb都是char*
2.指针与const结合的定义
const与指针配合使用有两种作用,一是限制指针变量,二是限制指针变量所指向的数据。
1)限制指针变量本身
指针变量本身的值不能被修改,但指向可以改变。被const修饰的指针只能在定义时初始化。
eg:int *const p;
int a=10;
p=&a;//err
正确形式:
int a=10;
int *const p=&a;
2)限制指针变量所指向的数据
写法:const int *p; int const *p;
指针可以指向不同变量(指针本身的值可以修改),但不能用指针修改指针所指之物的值。
eg:
int a=10;
int const *p=NULL;//right
p=&a;//right
*p=100;//err
3.*的作用
3.1)运算符
int val=0; int*p=&val;
*p**p---->0*0
3.2)类型 *变量名; *----指针标识
3.3)*指针变量名 *解引用
4.指针的算术运算
4.1)指针变量与整型量的加减表示移动指针。
long long *p; p+n 偏移量 n*sizeof(*p)B;
char**q; q+n 偏移量n*sizeof(char*)B;
s tudent*pstu; pstu+n 偏移量 n*sizeof(*pstu)B;
4.2)指针相减
条件:同一块连续内存区域
结果:整数,表示两个指针之间相差元素个数。
4.3)指针+1系列问题
4.3.1)指针变量类型不同,+1能力也不一样
4.3.2)指针变量和整形加减后的结果任然是指针类型。
4.3.3)指针变量不能乘除运算。
5.数组指针
形式:数据类型(*指针变量名)[数组长度]
eg:int(*p)[5];
初始化:
int arr[]={1,2,3,4};
int(*p)=&arr;
arr[2]<=>*(arr+2)//表示访问数组第三个元素。
6.指针数组(本质是数组,内部元素储存地址)
【地址】【地址】【地址】
7.函数指针
形式:返回值类型(*指针变量名)(参数列表)
eg:int(*pfunc)(int,int)
本质是指针 所指之物是个函数 函数名:函数入口地址
8.指针函数
形式:数据类型*函数名(参数列表)
eg:int*func(int a,int b);
本质是函数,返回值类型是指针(不能返回普通局部变量地址)
9.空指针,野指针
空指针:空指针是一个特殊的指针值,它不指向任何有效的内存地址。
eg:int *p=NULL;
野指针:野指针是指指向一个未确定或非法内存地址的指针。
10.大小端
10.1)存储模式:大端存储模式 小端存储模式
10.2)什么是大端:高低:高位数据存放在低地址位置
什么是小端:“滴滴”--低低 低位数据存储在低地址位置