目录
指针操作一维字符型数组
推导过程与一维字符型数组相同
char s[]="hello";
char *p = s;
可以用来存放字符串;
指针+字符串
字符串在c语言中是按照字符数组的形式存在,而字符串常量是存储在字符串常量区的。
处理字符串的形式:
(1)
char s[] = "hello";
这句代码表示数组s在栈上开辟一块空间,用字符串常量中的 "hello"进行初始化
(2)
const char *p = "hello";
这句代码表示p指向了字符串常量区中的 "hello",因为是指向了字符串常量区,所以只能做读取操作,不能修改。
实现字符串的相关函数
puts函数
int puts(const char *s);
void Puts(char s[])
void Puts(char *s)
它的实参可以是数组名,也可以是指针变量,也可以是字符串常量
用指针实现puts函数功能
int Puts(const char *s)
{
while(*s !='\0' )
{
putchar(*s++);
}
putchar('\n');
return 0;
}
指针实现gets函数功能
char* Gets(char *s)
{
char*ret = s;
while((*s = getchar())!='\n')
{
s++;
}
*s='\0';
return ret;
}
指针实现strlen函数功能
size_t Strlen(const char *s)
{
const char *ret=s;
while(*s != '\0')
s++;
return s-ret;
}
用指针实现strcpy函数功能
char *Strcpy(char *dest ,const char *src)
{
char *ret = dest;
while(*src != '\0')
{
*dest = *src;
src++;
dest++;
}
*dest = '\0';
return ret;
}
用指针实现strncpy函数功能
char *Strncpy(char *dest,const char *src,size_t n)
{
char *ret = dest;
while(*src!=0&&n!=0)
{
*dest = *src;
src++;
dest++;
--n;
}
while(n)
{
*dest = '\0';
dest++;
--n;
}
return ret;
}
用指针实现strcat函数功能
char *Strcat(char *dest,char *src)
{
char *ret = dest;
while(*dest!='\0')
dest++;
while(*src!='\0')
{
*dest=*src;
dest++;
src++;
}
*dest='\0';
return ret;
}
用指针实现strncat函数功能
char *Strncat(char *dest,char *src,size_t n)
{
char *ret = dest;
while(*dest!='\0')
dest++;
while(n &&*src!='\0')
{
*dest=*src;
dest++;
src++;
n--;
}
*dest='\0';
return ret;
}
用指针实现strcmp函数功能
int Strcmp(const char *s1,const char *s2)
{
while(*s1 == *s2 && *s1 != '\0' && *s2 != '\0')
{
s1++;
s2++;
}
return *s1-*s2;
}
用指针实现strncmp函数功能
int Strncmp(const char *s1,const char *s2,size_t n)
{
while(n>1 && *s1 == *s2 && *s1 != '\0' && *s2 != '\0')
{
s1++;
s2++;
n--;
}
return *s1-*s2;
}
memcpy函数
功能是实现内存的拷贝;
函数原型
void *memcpy(void *dest,const void *src ,size_t n)
void * 表示空类型的指针,它可以说是万能指针,因为它可以接受任意类型的指针;
NULL是空指针,注意区分两者;
注意:如果用空类型多指针进行间接运算,必须转换成有明确类型的指针;
用指针实现memcpy函数功能
void *Memcpy(void *dest,const void *src ,size_t n)
{
char *p =dest;
const char *q = src;
while(n)
{
*dest = *src;
dest++;
src++;
--n;
}
}
const关键字
在字符串函数中看到了很多的const char *s;它的效果是限定只读;;它还可以写成下面的三种形式
const char *s
char const *s
char * const s
假设
int *p;
int a = 10;
const int *p = &a
此时const限定的是基类型,就是说不能通过 *p =其他类型的数据赋值的方式修改基类型数据;
int const *p = &a;
这句代码的作用和上面的代码的一样;
int * const p = &a;
此时const限定是指针变量p ,表示将p限定为只读,不能做修改;
const int * const p = &a;
此时是基类型和指针变量都被限定为只读,既不能通过*p修改基类型数据,也不能修改指针变量p;
以上const符合就近原则,const离谁近就限定谁
const的应用
1.如果不想通过*p方式改变基类型对应的数据 可以使用以下代码
const int *p = &a;
int const *p = &a;
2.如果 指针变量p 定义好后,不想再指向别的变量 ,可以使用以下代码
int * const p = &a;
注意:形参设计为const char *s
(1)目的:是为了防止函数中有时候的失误操作
(2)好处:可以提前发现问题 ,将运行时可能发生的问题,提前到编译时就发现了;它还可以只接受char *和 const char *;