在模拟实现strcpy库函数中,函数参数部分使用到了const关键字.但由于篇幅有限,未能讲解const关键字的妙用,接下来一起来揭开const的神秘面纱吧!!!为方便查找,文末附上模拟实现strcpy库函数的博客连接.
代码一:
int main()
{
int num = 10;
int* p = #
*p = 20;
printf("%d\n", num);
return 0;
}
- 指针变量p用来接收num变量的地址.
- *p = 20;通过解引用操作找到num变量,并赋值为20.
- 此时打印的是num变量修改过后的值:20.
但是在某些场景中,我们并不希望变量被修改。在模拟实现strcpy库函数中,my_strcpy函数实现了字符串拷贝的功能,源空间存放的字符串可能存在被修改的风险,这是我们不愿看到的。在适当位置加const关键字可以巧妙化解这一风险.
代码二:
int main()
{
const int num = 10;
int* p = #
*p = 20;
printf("%d\n", num);
return 0;
}
运行结果:
- 可以明显看到num变量被修改了,const放在变量声明处达不到目的.
代码三:
int num = 10;
const int* p = #
*p = 20;//err
- 在声明指针变量p前面写const,num变量没有被成功修改.这是为什么呢?
- const修饰变量,这个变量就被称为常变量,不能被修改,但是本质上还是变量.
- const修饰指针变量的时候,const如果放在*的左边,修饰的是*p,表示指针指向的内容,是不能通过指针来改变的,但是指针变量本身是可以修改的.
int num = 10;
const int* p = #
int n = 100;
*p = 20;//err
p = &n;
- p是指针变量,*p是指针指向的内容(这里指向num变量)
代码四:
int num = 10;
int* const p = #
int n = 100;
*p = 20;
p = &n;//err
- const如果放在*的右边,修饰的是指针变量p,表示指针变量不能被改变,但是指针指向的内容是可以被修改的.
- p是指针变量,*p是指针指向的内容(这里指向num变量)
对const关键字修饰指针变量不同位置的作用有了一定的了解后,仿写my_strlen函数求字符串长度.
需要引用的头文件:#include <assert.h>
main主函数部分:
int main()
{
char arr[] = "abc";
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
my_strlen函数部分:
int my_strlen(const char* str)
{
//assert(str != NULL);
assert(str);//0为假,报错
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
- 字符串长度不能为负数,不能用int
- 代码应当有一定的健壮性
改进代码:
size_t my_strlen(const char* str)
{
assert(str != NULL);
assert(str);//0为假,报错
size_t count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
- size_t: unsigned int 无符号整型
模拟实现strcpy库函数博客链接:【C语言】C语言模拟实现strcpy库函数_weixin_53747462的博客-CSDN博客