const 的 双指针类型

来源:互联网 发布:护甲套淘宝 编辑:程序博客网 时间:2024/06/08 02:08

         前几天改别人的代码用到了双指针,而且双指针前面加了const,顿时就蒙了。

const BaseDescMod** _DESCMODS = new BaseDescMod* [globalConfig->mPtsNum*4];

 双指针的在分配内存时就出现问题了:

error C2440: “初始化”: 无法从“stasm::BaseDescMod **”转换为“const stasm::BaseDescMod **”

参阅了http://blog.csdn.net/g5dsk/article/details/7188468关于双指针加入const前缀的解释,算是明白了一些,

这里的** _DESCMODS是const BaseDescMod型,即指双指针指向的内容是常量,不可改变。

* _DESCMODS是 const BaseDescMod * 型,即 (* _DESCMODS) 这个指针的指向可以改变,但是其地址的内容不可改变。

所以在这样的双指针分配内存时,* _DESCMODS 在new  时,就应该写成如下形式:

const BaseDescMod** _DESCMODS = new const BaseDescMod* [globalConfig->mPtsNum*4];

即编译通过了。

 

另,指针常量和常量指针一直搞混淆,也得理一下。

char *str1={"Hello"};

1、指针常量:即指针本身是常量, 如:

char * const str2 = str1;

指针指向不可改变,但是地址内容却可以改变。

2、常量指针:即指向常量的指针,如:

const char * str3  = str1;

指针指向可改变,但是其地址内容却不可改变。


        这两种方法很容易晕掉,看到网上有一种说法:const在什么的右边,就是用来修饰什么。在char右边,即修饰char类型,即指向内容不可变;在*右边,即修改指针,即指针批向内容不可变。

        返回到最初的

       const BaseDescMod** _DESCMODS

         因为 const 修饰的是*,所以自然有:

const BaseDescMod** _DESCMODS = new const BaseDescMod* [globalConfig->mPtsNum*4];

         按这种顺序,我可以再加一句,以便能够准确说清楚它们的名字,const记为常量,*记为指针:

         const char *,即常量指针;

         char * const,即指针常量;