const char * const * expressions;这个定义怎么理解?

来源于hyperscan的hs_compile函数的第一个参数

下面代码中

Bjarne在他的The C++ Programming Language里面给出过一个助记的方法:把一个声明从右向左读
char * const cp; ( * 读成 pointer to )
cp is a const pointer to char
const char * p;
p is a pointer to const char;

expressions1 is a pointer to pointer to char
expressions2 is a pointer to pointer to const char
expressions is a pointer to const pointer to const char
expressions 本身可以改动,它指向的指针是不可以改动的,它指向的const 指针指向的 const char也是不可以改动的


 char a[4] = { 'a','a','a','\0' };
    char b[4] = { 'b','a','a','\0' };
    char * p = a;
    char * l = b;
    char * ptr2[2] = {p,l};

    char ** expressions1 = ptr2;
    expressions1[0] = b;
    expressions1[0][0] = 'c';

    const char ** expressions2 = ptr2;
    expressions2[0] = b;
    expressions2[0][0] = 'c';   //编译器报错

    const char * const * expressions = ptr2;
    expressions[0] = b;               //编译器报错
    expressions[0][0] = 'c';          //编译器报错
    expressions = expressions2;

常数指针常数,即expressions指向的地址不能变,且在那个地址上的值也不能做修改

指针存放的地址值不能修改,指针指向的内存也不能修改

//如果是char* expressions;
//那么可以
expressions = ....;
//也可以
*expressions = ...;

// 如果是const char* expressions;
// 那么可以
expression = ...;
// 但是不可以
*expression = ...;

// 如果是char* const expressions;
// 那么不可以
expression = ...;
// 但是可以
*expression = ...;

// 如果是const char* const expressions;
// 那么不可以
expression = ...;
// 也不可以
*expression = ...;