嵌入式开发(一)⑩浅谈const工作原理与const指针

const修饰变量

基本样板

const int a = 5;
// a为一个常变量,无法进行直接修改值的变量——但可以通过指针操作地址进行修改
【c++中则强制为常量,而非常变量,操作地址也不可修改】

常用说明

const int nums = 5;
// 用于某些值,我们不希望被修改时使用

const工作原理的说明

const一个限定变量的指定类型数据不可变的限定符。

工作模式
         总是优先对const左侧(必要时,对最近的数据类型修饰)的数据类型进行限制,满足贪婪原则~!

         贪婪规则:在寻找到数据类型前的所有*都被接受,作为待修饰的数据类型的部分(如:int ** const ptrs;)——中间过程出现的const会被当前const省略

(贪婪)eg
                  1. 如:int const p = 5; // 修饰的是int ,表示该变量所对应的int数据不可修改
                  2. 如: int * const ptr = &p; // 修饰的是int * (贪婪,const往左到第一个数据类型结束,为修饰对象), 所以ptr变量对应的int * 指针数据不可修改(也就是指针值不可改,为常量指针)
                  3. 如果:int ** const ptr2 = &ptr; // 修饰的是 int **

(优先左侧)eg
                  1. 如: int * const * ptr; // 修饰的是int * , 而忽视 *
                  2. 如:const int * ptr2; // 修饰 int,因为左边没有,所以以最近的数据类型进行修饰,依然是保留了贪婪规则的(这里const 到 int的中间,没有*,所以无法表现出来,而且C语言也保证了,在const左侧无法匹配限定时,右侧最近的数据类型一定不会存在*)


const 修饰指针

声明样板

const int * ptr;
int const * ptr;
int * const ptr;
const int * const ptr;
(特别的是,在一些编译器上,可能int * ptr const 等价于 int * const ptr ,但是有的编译器只支持 int * const ptr ,而不支持int * ptr const——由于此时的const左侧最近的变量阻断了修饰对象的寻找,而右侧又没有数据类型,故而判定语法错误。【同样的有的支持int * ptr const ,不支持int * const ptr ,则是考虑const修饰的最近的完整数据类型与变量,优先数据类型(包含贪婪规则)】)

声明限定的含义
                  1. const int * ptr; // 修饰 int,ptr值可修改,但此时*ptr指向的内容不可修改
                  2. int const * ptr; // 修饰 int,ptr值可修改,但此时*ptr指向的内容不可修改
                  3. int * const ptr; // 修饰 int * ,ptr值不可修改,但此时*ptr指向的内容可修改
                  4. const int * const ptr; // 修饰 int *和int ,ptr值不可修改,但此时*ptr指向的内容不可修改

const修饰多级指针的简单了解

声明样板:(二级指针为例)

cosnt int ** ptr;
int * const * ptr;
int * * const ptr;
int * const * const ptr;
const int * const * ptr;
const int * * const ptr;
cosnt int * const * const ptr;
// 分析依然是按照——先左后右,最近类型,贪婪收拢

声明限定含义:(二级指针为例)

                  1. cosnt int ** ptr; // 修饰 int , 最终 ** ptr 的内容不可修改, 其它可修改
                  2. int * const * ptr; // 修饰 int * , 最终 * ptr 的内容不可修改, 其它可修改
                  3. int * * const ptr; // 修饰 int * * , 最终 ptr 的内容不可修改, 其它可修改
                  4. int * const * const ptr; // 修饰 int* 和 int ** , 最终 ** ptr 和 *ptr 的内容不可修改, 其它可修改
                  5 .const int * const * ptr; // 修饰 int 和 int *, 最终 ** ptr 和 *ptr 的内容不可修改, 其它可修改
                  6. const int * * const ptr; // 修饰 int 和 int ** , 最终 ** ptr 和 ptr 的内容不可修改, 其它可修改
                  7. cosnt int * const * const ptr; // 修饰 int 、 int * 和 int ** , 全都不允许修改【**ptr、*ptr、ptr】

你可能感兴趣的:(嵌入式开发总结)