const关键字使用
在 C 语言中, const 关键字用于声明常量。以下是 const 关键字的常见用法:
1. 修饰变量:
- 声明一个值不能被修改的变量。例如: const int num = 10; 在此之后,尝试修改 num 的值将会导致编译错误。
2. 修饰指针:
- 指向常量的指针: const int *ptr; 表示指针指向的内容不能通过该指针修改,但指针本身可以指向其他地址。
- 常量指针: int * const ptr; 表示指针本身不能指向其他地址,但可以通过该指针修改其指向的内容。
- 指向常量的常量指针: const int * const ptr; 指针本身和其指向的内容都不能被修改。
3. 作为函数参数:
- 可以防止函数内部意外修改传入的参数值。
4. 修饰数组:
- const int arr[] = {1, 2, 3}; 数组中的元素不能被修改。
const 关键字的使用可以增强程序的可读性和可维护性,同时有助于避免一些由于意外修改值而导致的错误。
指针操作一维字符型数组(字符串)
在 C 语言中,使用指针操作字符串具有以下优点:
优点:
1. 灵活性高:能够直接访问和修改字符串中的字符,提供了更细粒度的控制。
2. 节省内存:通过指针传递字符串可以避免复制整个字符串,从而节省内存和提高性能,特别是在处理大型字符串时。
3. 高效的字符串处理:可以方便地实现字符串的拼接、截取、查找等操作。
然而,也存在一些缺点:
缺点:
1. 容易出错:指针操作需要谨慎处理,否则可能导致内存访问错误,如越界访问,这可能导致程序崩溃或产生不可预测的结果。
2. 可读性较差:对于不熟悉指针操作的开发者来说,代码可能较难理解和维护。
3. 内存管理复杂:需要手动管理内存的分配和释放,若处理不当可能导致内存泄漏。
以下是指针操作字符串的事例
my_puts
int my_puts(const char *str)
{
while (*str!= '\0') {
putchar(*str);
str++;
}
putchar('\n');
return 0;
}
my_gets
char *my_gets(char *s)
{
char *ret=s;
int i = 0;
while ((*s++ = getchar())!= '\n') ;
*--s = '\0';
return ret;
}
my_strlen
size_t my_strlen(const char *str)
{
size_t len=0;
while(*str!='\0')
{
str++;
len++;
}
return len;
}
my_strcpy
char *my_strcpy(char *dest, const char *src)
{
char *ret=dest;
while((*dest++ = *src++) != '\0');
return ret;
}
my_strncpy
char *my_strncpy(char *dest, const char *src,size_t n)
{
char *ret=dest;
while(n && (*dest++ = *src++) != '\0')
n--;
while(n--)
*dest++ = '\0';
return ret;
}
my_strcat
char *my_strcat(char *dest,const char *src)
{
char *ret = dest;
while(*dest++ != '\0') ;
dest--;
while((*dest++ =*src++)!='\0');
return ret;
}
my_strncat
char *my_strncat(char *dest,const char *src,size_t n)
{
char *ret = dest;
while(*dest++ != '\0') ;
dest--;
while(n && (*dest++ =*src++)!='\0')
n--;
if(n)
*dest='\0';
return ret;
}
my_strcmp
int my_strcmp(const char *str1,const char *str2)
{
while(*str1!='\0' && *str2!='\0'&& *str1 == *str2 )
{
++str1;
++str2;
}
return *str1-*str2;
}
my_strncmp
int my_strncmp(const char *str1,const char *str2,size_t n)
{
while(*str1!='\0' && *str2!='\0'&& *str1 == *str2 && n>1 )
{
++str1;
++str2;
--n;
}
return *str1-*str2;
}
my_memcpy
void *my_memcpy(void *dest,const void *src,size_t n)
{
char *q = dest;
const char *p =src;
while(n)
{
*q++ = *p++;
--n;
}
return ;
}