常量指针(指向常量的指针)和指针常量

首先要贴一段文档

int p; //这是一个普通的整型变量

int *p; //首先从P 处开始,先与*结合,所以说明P 是一个指针,然后再与int 结合,说明指针所指向的内容的类型为int 型.所以P 是一个返回整型数据的指针

int p[3]; //首先从P 处开始,先与[]结合,说明P 是一个数组,然后与int 结合,说明数组里的元素是整型的,所以P 是一个由整型数据组成的数组

int *p[3]; //首先从P 处开始,先与[]结合,因为其优先级比*高,所以P 是一个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与int 结合,说明指针所指向的内容的类型是整型的,所以P 是一个由返回整型数据的指针所组成的数组

int (*p)[3]; //首先从P 处开始,先与*结合,说明P 是一个指针.然后再与[]结合(与"()"这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组,然后再与int 结合,说明数组里的元素是整型的.所以P 是一个指向由整型数据组成的数组的指针

int **p; //首先从P 开始,先与*结合,说是P 是一个指针,然后再与*结合,说明指针所指向的元素是指针,然后再与int 结合,说明该指针所指向的元素是整型数据.由于二级指针以及更高级的指针极少用在复杂的类型中,所以后面更复杂的类型我们就不考虑多级指针了,最多只考虑一级指针.

int p(int); //从P 处起,先与()结合,说明P 是一个函数,然后进入()里分析,说明该函数有一个整型变量的参数,然后再与外面的int 结合,说明函数的返回值是一个整型数据

int (*p)(int); //从P 处开始,先与指针结合,说明P 是一个指针,然后与()结合,说明指针指向的是一个函数,然后再与()里的int 结合,说明函数有一个int 型的参数,再与最外层的int 结合,说明函数的返回类型是整型,所以P 是一个指向有一个整型参数且返回类型为整型的函数的指针

int *(*p(int))[3]; //从P 开始,先与()结合,说明P 是一个函数,然后进入()里面,与int 结合,说明函数有一个整型变量参数,然后再与外面的*结合,说明函数返回的是一个指针,然后到最外面一层,先与[]结合,说明返回的指针指向的是一个数组,然后再与*结合,说明数组里的元素是指针,然后再与int 结合,说明指针指向的内容是整型数据.所以P 是一个参数为一个整数据且返回一个指向由整型指针变量组成的数组的指针变量的函数.

//说到这里也就差不多了,我们的任务也就这么多,理解了这几个类型,其它的类型对我们来说也是小菜了,不过我们一般不会用太复杂的类型,那样会大大减小程序的可读性,请慎用,这上面的几种类型已经足够我们用了.

 

现在来分析特别的:const char *pStr和char * const pStr。我不知道以下这样理解是否正确,如果你有更好的意见请给我留言指出错误或不足,我非常的感谢你!

在看到上面的资料之后我是这样理解const char *pStr和char * const pStr的。

const char *pStr;

1、首先pStr左结合没有const关键字,说明pStr是一个变量而非常量

2、与*结合,说明pStr是一个指针变量

3、与char结合,说明pStr是一个指向字符类型的指针变量

4、与const结合,说明pStr是一个指向常量字符类型的指针变量(明显不对,pStr应该是一个指向常量字符串类型的指针变量)

char * const pStr;

1、首先pStr左结合有const关键字,说明pStr是一个常量而非变量

2、与*结合,说明pStr是一个指针常量

3、与char结合,说明pStr是一个指向字符类型的指针常量(明显不对,pStr应该是一个指向字符串类型的指针常量)

 

常量指针和指针常量,说实在话我对这个理解起来真的很难。之前对这个知识点是似懂非懂的状态,每到要用的的时候总要去翻书,经常搞混淆。在看到上面的资料之后我才明白了。对于变量的定义也能举一反三,只要理解了就简单了。

  可是,在写这篇博文时我又迷惑了,于是又找资料看。链接在此:http://www.cnblogs.com/rushuizhijing/archive/2011/08/26/2154737.html#2328051。看了这篇博文后,对于这个知识点又加深了理解,以前的理解全是在指针的限制层面,而这篇博文让我看到了最底层的内存的限制层面。不过有个疑问:“由于没有 const *的运算”这是什么意思?

现在,我是这样理解const char *pStr和char * const pStr的。

const char *pStr;

1、首先应该把const char *pStr分解为const char *和pStr分别来看,那么pStr是const char *类型的变量既pStr指向一个常量字符串。或者说pStr对应内存中存放着另一内存的地址,这一内存存放的是字符串(内存中的数据是可读可写的,除了系统敏感区,如操作系统内核所在区域),const关键字只是限定了我们程序员只能对这片内存进行只读操作。至于pStr对应内存我们可以随便读写。

char * const pStr;

1、首先应该把char * const pStr分解为char *和const pStr分别来看,那么pStr是char *类型的常量既pStr指向一个字符串。或者说pStr对应内存中存放着另一内存的地址,这一内存存放的是字符串(内存中的数据是可读可写的,除了系统敏感区,如操作系统内核所在区域),const关键字只是限定了我们程序员只能对pStr对应内存进行只读操作。至于存放字符串的这一内存我们可以随便读写。

  

  写到最后,我不禁怀疑自己是不是太笨了,我不敢肯定是否正确理解了。太晚了,弄了好几个小时,脑子有点糊涂啦。

  于是,恳请各位朋友发表你的看法,帮助我理解。在此感谢你!

 

更正:

1:

const char *pStr = "Hello World";  // pStr是一个指向常量字符串的指针变量

pStr = "hello";  // pStr可以指向另一个常量字符串

pStr[0] = 'N';  // Error,这里pStr[0]操作的是常量字符串的字符

 

2:

char * const pStr = "Hello World";  // pStr是一个指向字符串的指针常量

pStr = "Hello";  // Error,这里pStr是一个常量,初始化后就不能再改变它的值了(与"Hello World"绑定了),相当于引用。

pStr[0] = 'N';  // OK,这里pStr[0]操作的是字符串的字符

posted on 2012-05-02 23:20  上路  阅读(4087)  评论(12编辑  收藏  举报

导航