【C】const 关键字 xTaskCreate(const char * const pcName)

发布时间:2024年01月12日

const

1)基本概念

const是C语言的一个关键字。

const主要用于创建常量指定变量为只读,即在程序运行过程中不能被修改。

const 常用于 修饰常量修饰指针修饰函数参数(常用)。

2)修饰常量

使用 const 还可以将变量声明为只读,即不能在后续的代码中修改它的值。

const int count = 5;

在这个例子中,count 被声明为只读变量,任何尝试修改它的操作都将导致编译错误。

3)修饰指针

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

4)修饰函数参数(常用)

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修饰,让其不可被修改呢?不如直接不用地址传递,就用普通的值传递?

因为:当你将函数的形参改为指针时,实际上是传递了变量的地址而不是变量的值,这样可以避免在内存中复制一份新的副本,从而减少内存的使用。

5)以FreeRTOS代码为例

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 ); // 任务句柄, 以后使用它来操作这个任务
  • 第二行,形参2:使用了 常量指针常量。
  • 第三行,形参3:使用了 普通常量。
  • 第四行,形参4,使用了 指针常量,表明在函数中,不能更改指针的指向。
  • 第六行,形参6,使用了 指针常量,表明在函数中,不能更改指针的指向。
文章来源:https://blog.csdn.net/weixin_44029896/article/details/135544612
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。