C++ c++;指针到指针的常数

C++ c++;指针到指针的常数,c++,pointers,constants,const-correctness,C++,Pointers,Constants,Const Correctness,指向常量int的指针。我可以更改指针,但不能更改值: const int* a; 指向int的常量指针。我可以不更改指针,但可以更改变量的值: int* const a; 现在,如果我在处理指向指针的指针,事情会是什么样子 int** a; 我如何: a) 声明指向非常量int的非常量指针的常量指针 b) 声明指向非常量int的常量指针的非常量指针 c) 声明一个指向非常量指针的非常量指针,该指针指向常量int ? a) 声明指向非常量的指针 注意,由于上面的指针是const-限定的,因此

指向常量int的指针。我可以更改指针,但不能更改值:

const int* a;
指向int的常量指针。我可以不更改指针,但可以更改变量的值:

int* const a;
现在,如果我在处理指向指针的指针,事情会是什么样子

int** a;
我如何:

a) 声明指向非常量int的非常量指针的常量指针

b) 声明指向非常量int的常量指针的非常量指针

c) 声明一个指向非常量指针的非常量指针,该指针指向常量int ?

a) 声明指向非
常量的
指针

注意,由于上面的指针是
const
-限定的,因此必须在声明处初始化它。否则,它将无法编译

b) 声明指向
常量的非
指针
指向非
常量的指针

c) 声明指向非
常量的非
指针
指向
常量的指针


对于
常量
指针,模式为:

T * const ptr; // const pointer to T
T * ptr; // non-const pointer to T
对于非
常量
指针:

T * const ptr; // const pointer to T
T * ptr; // non-const pointer to T
然后,为最外面的指针选择上面适当的模式,并相应地为最里面的指针(即,类型中最深的指针)替换
T

  • 常量
    指向非
    常量的指针
    int
    T=int*
  • const
    指向非
    const
    int
    T=int*const
  • 常量
    指向
    常量的指针
    int
    T=const int*

这是关于
常数相对于
*
的位置:如果
常数在左边,那么指向的是
常数
,如果
常数
*
的右边,那么指向的是
常数

我建议使用typedefs。大量的typedef。许多类型定义彼此建立。足够多的类型定义使你憎恨生活,以至于你在未来避免这种愚蠢。是的,区别可能很重要。不,我从来没有见过生产代码,它是至关重要的。公平地说:“我从来没有注意到代码重要的地方”,在我作为程序员的20年生涯中,其中大部分都是在C++中使用的。这是为了理解我的正确性,而不是为了编写生产代码。当我试图用动态分配的
static char**foo
替换静态分配的
static const char*foo[1000]
时,我确实遇到了这个问题,编译器不允许我将字符串文本分配给fooThe
const
关键字绑定到它最左边的元素。(除非
const
首先出现,在这种情况下,它将绑定到其右侧的对象。)
T * ptr; // non-const pointer to T