易混淆概念(二)指针常量与常量指针

来源:互联网 发布:java web开发实战1200 编辑:程序博客网 时间:2024/05/16 06:46
參考:http://blog.csdn.net/xiaota00/article/details/60132405?locationNum=1&fps=1
指针常量与常量指针

 const是一个C/C++语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性

讀法:從后向前。沿着*号划一条线,const和谁在一边,那么谁就是const,即const限定的元素就是它。

1、指向常量的指针(指針常量,常量修飾的是指針內容)

const int *pa;

int const *pa;

两者等价。因为指向常量的指针有时候会指向常量,所以它具有这个性质:“不能靠解引用改变它指向的对象的值”,以此保护它所指向的常量的常量性:
*pa =d; // 不可行(d是已经声明过的整型)

*pa =d; // 不可行(d是已经声明过的整型)

但指针本身的值(地址)是可变的:

pa=& d; // 可行(d是已经声明过的整型)

而且指向常量的指针有时候也会指向变量,如下:

int t,u;

const int *pa;

pa =&t; //可行,指向变量t

pa =&u; //也可行,指向变量u

我们可以把它理解成:“为了指向常量而发明的指针”,这样比较贴切。

指針常量:指針所指向的內容不可變,但是地址可變。

2、常量指针:(常量修飾的是地址)

int *const pa=&n; // n是之前已经声明过的整型变量,注意必须是变量,理由见下

“常量指针”即指针本身的值是常量,但“能靠解引用改变它指向的对象的值”,如下:

pa=&d; // 不可行(d是已经声明过的整型)

*pa =d; // 可行(d是已经声明过的整型)

因为常量指针也是一种const常量,所以它同样必须在第一次声明时就初始化,初始化后地址不能改變,不过它的初始值缩小为只能是变量(的地址),因为只有变量才能确保以后能靠解引用而改变它指向的对象的值。这使得常量指针不象一般的const常量,用变量或常量初始化都可以。

也就是说,常量指针反而总是指向变量(內容)的。

举例:

typedef char * pStr;
char string[4] = "abc";
const char *p1 = string;    //指針常量
const pStr p2 = string;      //常量指針   等價于char * const  p2 
p1++;  //地址可變
p2++;  //地址不可變


  答案与分析:

  问题出在p2++上。

  1)、const使用的基本形式:
const char m
  限定m不可变。

  2)、替换1式中的m, const char *pm; 
  限定*pm不可变,当然pm是可变的,因此问题中p1++是对的。

  3)、替换1式char, const newType m; 
  限定m不可变,问题中的char *ptr就是一种新类型,因此问题中p2不可变,p2++是错误的。


char *p = "i'm hungry!";
p[0]= 'I';


  答案与分析

  上面的代码可能会造成内存的非法写操作。分析如下, “i'm hungry”实质上是字符串常量(可索引而不可修改),而常量往往被编译器放在只读的内存区,不可写。p初始指向这个只读的内存区,而p[0] = 'I'则企图去写这个地方,编译器当然不会答应。
总结:

  1)、const在前面

const int nValue; //nValue是const
const char *pContent; //*pContent(內容)是const, pContent(地址)可变
const (char *) pContent;//pContent是const,*pContent可变
char* const pContent; //pContent是const,*pContent可变

const char* const pContent; //pContent(地址)和*pContent(內容)都是const
  2)、const在后面,与上面的声明对等

int const nValue; // nValue是const
char const * pContent;// *pContent(內容)是const, pContent(地址)可变
(char *) const pContent;//pContent(地址)是const,*pContent(內容)可变
char* const pContent;// pContent是(地址)const,*pContent(內容)可变

char const* const pContent;// pContent(地址)和*pContent(內容)都是const
  答案与分析:

  const和指针一起使用是C语言中一个很常见的困惑之处,在实际开发中,特别是在看别人代码的时候,常常会因为这样而不好判断作者的意图,下面讲一下我的判断原则:

  沿着*号划一条线,const和谁在一边,那么谁就是const,即const限定的元素就是它。你可以根据这个规则来看上面声明的实际意义,相信定会一目了然。

  另外,需要注意:对于const (char *) ; 因为char *是一个整体,相当于一个类型(如 char),因此,这是限定指针是const
原创粉丝点击