赞
踩
目录
const char *s const表示只读 此时const限定的是基类型,表示不能通过*s的方式修改基类型。
char const *s 此时还是const限定的是基类型,表示不能通过*s的方式修改基类型。
char * const s 此时const限定指针变量s,表示s只读,不能修改指针变量s
就近原则:const离谁近就限定谁
应用:1.如果不想通过*p方式修改基类型对应的数据,就选择const int * p;
2.指针变量p定义好后,不想再指向别的变量,就选择int *const p;
使用const的好处:
1.能提前发现代码中的问题,将运行时的问题提前到编译时显示出来
2.能够接收可修改变量和常量两种。
以下是用指针完成的与字符串相关的函数的代码
- //puts输出字符串
- int Puts(const char *s)
- {
- if (s == NULL)
- {
- return -1;
- }
-
- while (*s != '\0')
- {
- printf("%c",*s);
- s++;
- }
-
- putchar('\n');
-
- return 0;
- }
-
- //gets从键盘获取字符串,存到s中,返回s的首地址
- char *Gets(char *s)
- {
- char *ret = s;
-
- while ((*s = getchar()) != '\n')
- {
- s++;
- }
-
- *s = '\0';
-
- return ret;
- }
-
- //strlen计算字符串中的长度,返回长度
- int Strlen(const char *s)
- {
- int len = 0;
-
- while (*s != '\0')
- {
- len++;
- s++;
- }
-
- return len;
- }
-
- //strcpy将源字符串复制到目标字符串
- char *Strcpy(char *dest,const char *src)
- {
- char *ret = dest;
-
- while (*src != '\0')
- {
- *dest = *src;
- dest++;
- src++;
- }
-
- *dest = '\0';
-
- return ret;
- }
-
- //strncpy复制源目标字符串中的n个字符,如果n大于原字符串的长度,目标字符串能被称为字符串,n小于源字符串长度时,只保证复制了n个字符,目标字符数组中不一定有停止标志
- char *Strncpy(char *dest,const char *src,size_t n)
- {
- char *ret = dest;
-
- while (n--)
- {
- if (*src != '\0')
- {
- *dest = *src;
- dest++;
- src++;
- }
- else
- {
- *dest = '\0';
- dest++;
- }
- }
-
- return ret;
- }
-
- //strcat拼接字符串
- 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;
- }
-
- //可以控制要将源字符串中的几个字符拼接过去,并一定构成字符串
- char *Strncat(char *dest,const char *src,size_t n)
- {
- char *ret = dest;
-
- while (*dest != '\0')
- {
- dest++;
- }
-
- while (n && *src != '\0')
- {
- *dest = *src;
- src++;
- dest++;
- 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;
- }
-
- //可以规定比较的范围
- int Strncmp(const char *s1,const char *s2,size_t n)
- {
- while (*s1 == *s2 && *s1 != '\0' && *s2 != '\0' && --n)
- {
- s1++;
- s2++;
- }
-
- return *s1 - *s2;
- }
补充:为什么strcpy和strcat要设计成返回字符串的首地址?
再变量中定义了a,b,c;可以完成连续赋值,即a=b=c=10;这两个函数设计成返回字符串的首地址也是为了可以完成类似操作,即链式操作,如 strcpy(s1,strcpy(s2,"hello"));
memcpy也能完成字符串的复制,但其功能更强大的地方在于,它不止能完成字符串的复制,任意类型的数组都能进行复制,完成过程如下:
- //memcpy完成过程
- void *Memcpy(void *dest,const void *src,size_t n)
- {
- char *p = (char *)dest; //dest为空类型,memcpy是一个字节一个字节进行复制,所以将其强转成char *类型
- const char *q = (char *)src;
-
- while (n)
- {
- *p = *q;
- p++;
- q++;
- n--;
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。