您的位置:首页 > 编程语言 > C语言/C++

C++中常量指针,指针常量(const 和*)的使用方法和理解方法

2016-04-08 00:00 120 查看
摘要: C++中常量指针,指针常量(const 和*)的使用方法和理解方法

当const和指针一起使用的时候,会出现很多复杂的情况,这些复杂的情况大概可以归纳为3种情况:
(1),指向常量的指针。
(2),常指针。
(3),指向常量的常指针。
现在,我来为大家分析这三种使用情况以及用法。

(1),指向常量的指针是是说一个指向常量的指针变量,例如:
const char* name = "chen"; //声明指向常量的指针。
这个语句的含义为:声明一个名字为name的指针变量,它指向一个常量(这个常量为字符型),初始化name为指向字符串“chen”。
由于使用的const,不允许改变该指针所指向的地址中的常量,因此以下语句是错误的:
name[3] = 'a'; //报错,指针所指向的地址中的值是常量值,不能改变。
但是,由于name是一个指向常量的一般指针变量,不是常指针,因此可以改变name所指向的地址。以下操作是正确的:
name = "abcd"; //合法,可以改变指针所指向的地址。
该语句付给了name另外一个字符串的首地址,改变了name的值。

(2),常指针是把指针所指的地址(而不是它所指向的对象)声明为常量,例如:
char* const name = "chen"; //常指针
这个语句的含义是:声明一个名字为name的指针变量,该指针是指向字符型数据的常指针,用"chen"的地址初始化该常指针。
创建一个常指针,就是创建一个不能移动的固定指针,即不能改变它所指向的地址,但是可以改变所指向的地址中的数据。例如:
name[2] = 'a'; //合法,改变所指向的地址中的值
name = “abcd”; //编译不通过,name所指向的地址是不能够被改变的。
第一个语句是要改变指针所指的地址中的数据,这是合法的,而第二个语句则是要改变该常指针的地址,显然是不合法的。

(3),指向常量的常指针,是指这个指针本身不能被改变,它所指向的地址中的数据也是不能被改变的。要声明这个指向常量的常指针,二者在声明的时候都要用const,例如:
const char* const name = "chen"; //指向常量的常指针。
这个语句的含义是:声明一个名字为name的指针变量,它是一个指向字符型常量的常指针,用”chen“的地址初始化该指针。因此,对于以下两个表达式都是错误的:
name[2] = 'a'; //出错,指针所指向的地址中存的是常量,不能更改
name = "zhang"; //出错,该指针所指向的地址不能被更改。

补充说明:
(1),如果用const定义的是一个整型常量,关键字int可以被省略。所以以下的两行定义是完全等价的:
const int MAXSIZE = 10;
const MAXSIZE = 10; //省略了关键字int
(2),常量一旦被建立,在程序的任何地方都不能更改。
(3),与#define定义的常量有所不同,const定义的常量可以有自己的数据类型,这样C++可以进行更加严格的类型检查,具有良好的编译时的检测性。
(4),函数的形参也可以用const说明,用于保护形式参数在该函数内部不会被改变,大多数C++编译器能对具有const参数的函数进行更好的代码优化。例如,希望通过函数i_MAX求出整形数组a[200]中的最大值,函数原型是:
int i_MAX(const int* ptr);
调用时的格式可以是:
i_MAX(a);
这样做的目的是为了确保原数组中的值不会被破坏,即在函数中,只允许对该数组进行读,不允许进行写。
------------------------------------------------------------------------------------------- 以上内容由阮坤原创,若需要转载,请注明出处。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++