const的使用

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值