const
是C语言的一个关键字。
const
主要用于创建常量或指定变量为只读,即在程序运行过程中不能被修改。
const
常用于 修饰常量、修饰指针、修饰函数参数(常用)。
使用 const
还可以将变量声明为只读,即不能在后续的代码中修改它的值。
const int count = 5;
在这个例子中,count
被声明为只读变量,任何尝试修改它的操作都将导致编译错误。
const
修饰指针,分为三种情况:
常量指针:const修饰的是指向的值,指针指向可以改,指针指向的值不可以更改
const int * p1 = &a;
指针常量:const修饰的是指针,指针指向不可以改,指针指向的值可以更改
int * const p2 = &a;
常量指针常量:const既修饰指针又修饰指向的值,都不可变
const int * const p3 = &a;
示例:
int main() {
int a = 10;
int b = 10;
//const修饰的是指向的值,指针指向可以改,指针指向的值不可以更改
const int * p1 = &a;
p1 = &b; //正确
//*p1 = 100; 报错
//const修饰的是指针,指针指向不可以改,指针指向的值可以更改
int * const p2 = &a;
//p2 = &b; //错误
*p2 = 100; //正确
//const既修饰指针又修饰指向的值
const int * const p3 = &a;
//p3 = &b; //错误
//*p3 = 100; //错误
system("pause");
return 0;
}
const
还可以用于修饰函数参数,表明在函数内部不会修改这个参数的值。
在学习这一点之前需要先学习函数参数传递的两种方式。
在C语言中,函数的参数传递方式主要有两种:值传递(传值)地址传递(传址)。
值传递:是将实际参数的值传递给函数的形参,形参的修改不影响实际参数。
地址传递:是将实际参数的地址传递给函数的形参,通过这个地址可以访问和修改实际参数的值。
//值传递
void swap1(int a ,int b)
{
int temp = a;
a = b;
b = temp;
}
//地址传递
void swap2(int * p1, int *p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
这个时候,如果传入指针参数的同时,不想修改实参,就可以用const修饰输入的指针参数,表明在函数内部不能修改这个参数的值。
//地址传递
void swap2(const int * p1, const int *p2) // 这是 常量指针 形参,指针指向的值将不可修改
{
int temp = *p1;
*p1 = *p2; // 错误,不可修改
*p2 = temp;// 错误,不可修改
}
提问:那么,为什么既然使用了地址传递,不就是为了能在函数内部更改实参的值吗?为什么还要加const修饰,让其不可被修改呢?不如直接不用地址传递,就用普通的值传递?
因为:当你将函数的形参改为指针时,实际上是传递了变量的地址而不是变量的值,这样可以避免在内存中复制一份新的副本,从而减少内存的使用。
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, // 函数指针, 任务函数
const char * const pcName, // 任务的名字
const configSTACK_DEPTH_TYPE usStackDepth, // 栈大小,单位为word,10表示40字节
void * const pvParameters, // 调用任务函数时传入的参数
UBaseType_t uxPriority, // 优先级
TaskHandle_t * const pxCreatedTask ); // 任务句柄, 以后使用它来操作这个任务