多重ポインタの const の付け方をまとめました。 まずは普通のポインタから。

int main()
{
    const int* x = new int(0);       // ポインタの指す内容を書き換えることができない
    int* const y = new int(0);       // ポインタの指すアドレスを書き換えることができない
    const int* const z = new int(0); // どちらの操作もできない
    *x = 1;
    *y = 1;
    x = nullptr;
    y = nullptr;

    return 0;
}
$ clang sample.cpp -std=c++11
sample.cpp:5:8: error: read-only variable is not assignable
    *x = 1;
    ~~ ^
sample.cpp:8:7: error: cannot assign to variable 'y' with const-qualified type 'int *const'
    y = nullptr;
    ~ ^
sample.cpp:4:16: note: variable 'y' declared const here
    int* const y = new int(0);
    ~~~~~~~~~~~^~~~~~~~~~~~~~
2 errors generated.

二重ポインタの場合

int main()
{
    int** x = nullptr;
    const int* const* a = x; // 一重ポインタ (*a) と値 (**a) を書き換えることができない
    int* const* b = x;       // 一重ポインタ (*b) の指すアドレスを書き換えることができない
    int** const c = x;       // 二重ポインタ (c) の指すアドレスを書き換えることができない
    **a = 1;
    **b = 1;
    **c = 1;
    *a = nullptr;
    *b = nullptr;
    *c = nullptr;
    a = nullptr;
    b = nullptr;
    c = nullptr;

    return 0;
}
$ clang sample.cpp -std=c++11
sample.cpp:7:9: error: read-only variable is not assignable
    **a = 1;
    ~~~ ^
sample.cpp:10:8: error: read-only variable is not assignable
    *a = nullptr;
    ~~ ^
sample.cpp:11:8: error: read-only variable is not assignable
    *b = nullptr;
    ~~ ^
sample.cpp:15:7: error: cannot assign to variable 'c' with const-qualified type 'int **const'
    c = nullptr;
    ~ ^
sample.cpp:6:17: note: variable 'c' declared const here
    int** const c = x;
    ~~~~~~~~~~~~^~~~~
4 errors generated.

よくある間違い

int main()
{
    int** x = nullptr;
    const int** a = x;

    return 0;
}
$ clang sample.cpp -std=c++11
sample.cpp:4:17: error: cannot initialize a variable of type 'const int **' with an lvalue of type 'int **'
    const int** a = x;
                ^   ~
1 error generated.

int**const int** に変換することはできません。

おまけ(三重ポインタ)

int main()
{
    int*** x = nullptr;
    const int*** a = x;       // const - none  - none
    int* const** b = x;       // none  - const - none
    const int* const** c = x; // const - const - none
    const int** const* d = x; // const - none  - const

    int* const* const* e = x; // none  - const - const これは OK

    return 0;
}
$ clang sample.cpp -std=c++11
sample.cpp:4:18: error: cannot initialize a variable of type 'const int ***' with an lvalue of type 'int ***'
    const int*** a = x;       // const - none  - none
                 ^   ~
sample.cpp:5:18: error: cannot initialize a variable of type 'int *const **' with an lvalue of type 'int ***'
    int* const** b = x;       // none  - const - none
                 ^   ~
sample.cpp:6:24: error: cannot initialize a variable of type 'const int *const **' with an lvalue of type 'int ***'
    const int* const** c = x; // const - const - none
                       ^   ~
sample.cpp:7:24: error: cannot initialize a variable of type 'const int **const *' with an lvalue of type 'int ***'
    const int** const* d = x; // const - none  - const
                       ^   ~
4 errors generated.

const を付け始めたら右端までキッチリ付けること。