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

xiaoxiao2021-02-28  98

參考: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
转载请注明原文地址: https://www.6miu.com/read-63726.html

最新回复(0)