const介绍
const修饰变量的时候,是在语法层面限制了const修改
但是本质上,num还是变量,是一种不能被修改的变量
int main()
{
const int num = 10;
printf("num = %d\n", num);
num = 20;
printf("num = %d\n", num);
return 0;
}
这里num=20行会报错,因为const修饰了num,限制了num的修改。
但是如果代码改为
int main()
{
const int num = 10;
printf("num = %d\n", num);
int *p = #
*p = 20;
printf("num = %d\n", num);
return 0;
}
代码是不会报错的,并且可以正确运行。
那么如何来避免这种现象呢?如何确保const真的完全限制了num的改变?
可以直接用const修饰指针
const 放在*的左边
限制的指针指向的内容,也就是说:不能通过指针来修改指针指向的内容
但是指针变量是可以修改的,也就是指针可以指向其他变量
const 放在*的右边
限制的是指针变量本身,指针变量不能再指向其他对象
但是可以通过指针变量来修改指向的内容
const在*左边
int main()
{
const int num = 10;
printf("num = %d\n", num);
int const * p = #
*p = 20;//err
int n = 1000;
p = &n;//ok
printf("num = %d\n", num);
return 0;
}
const在*右边
int main()
{
const int num = 10;
printf("num = %d\n", num);
int * const p = #
*p = 20;//ok
int n = 1000;
p = &n;//err
printf("num = %d\n", num);
return 0;
}
const放在*两侧
int main()
{
const int num = 10;
printf("num = %d\n", num);
int const * const p = #
*p = 20;//err
int n = 1000;
p = &n;//err
printf("num = %d\n", num);
return 0;
}
模拟实现库函数:strcpy
#include <assert.h>
char* my_strcpy(char* dest, const char* src)
{
//断言
char* ret = dest;
assert(dest != NULL);
assert(src != NULL);
//从src指向的字符串中拷贝内容到dest指向的空间
//\0也会被拷贝到目标空间
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "xxxxxxxxxxxxxx";
char arr2[] = "hello bit";
printf("%s\n", my_strcpy(arr1, arr2));
return 0;
}
断言:assert
assert 是一个宏,用于在运行时(当程序正在执行时)检查特定条件,在调试程序时非常有用。
需要头文件 #include <assert.h>
意思是:一旦dest || src == NULL ,程序就会中止。
模拟strlen函数——优化版
size_t my_strlen(const char* str)
{
assert(str != NULL);
size_t count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "abc";
size_t len = my_strlen(arr);//传递的是数组首元素的地址
printf("%zd\n", len);
return 0;
}