const指针用法总结

来源:互联网 发布:淘宝ios代退款店铺 编辑:程序博客网 时间:2024/05/16 10:35

1.const限定符

const限定符可以把一个对象转换成一个常变量,常量在定义后就不能被修改,因此定义时必修初始化。

const int bufSize = 512;//OKbufSize = 0;//error,bufSize是不可修改的左值const int i;//error,未初始化

2.const与指针

2.1指向常量的指针变量

一般形式:

const 类型名 * 指针变量名;

const int * p1;//定义了指向常量的指针变量

说明:

const限定的是p1指针指向的对象,而不限定指针p本身;在定义时可以不初始化,允许重新赋值指向其他的const对象,但不能通过p改变所指对象的值

例子:

const int a = 10;//a是常量,必须定义时初始化且不能再改变const int b = 15;const int *p1;p1 = &a;//ok*p1= 20;//error,试图通过指针p1改变它指向对象a的值p1 = &b;//ok,指向是可以改变的*p1= 20;//error,试图通过指针p1改变它指向对象b的值

分析:

本质上来说,由于没有方法分辩p1所指的对象是否为const,系统会把它所指向的所有对象都视为const。所以指向 const 对象的指针也可以指向 非const 对象。

例子:

int c = 15;//非const对象p1 = &c;//ok,指向非const对象*p1 = 20;//error

总结:

      定义时可以未初始化,任何企图通过指向const对象的指针修改其值的行为都会导致编译出错。指针本身的值可以改变,这样指针变量p1就指向了不同的地址,对它进行解引用操作,就会得到不同的值。

      在实际的程序中,指向 const 的指针常用作函数的形参。将形参定义为指 向 const 的指针,以此确保传递给函数的实际对象在函数中不因为形参而被修改。

2.1.1继续分析

(1)把一个 const 对象的地址赋给一个普通的、非 const 对象的指针会导致编译时的错误
例子:

const int val = 15;//const对象void *ptr2 = &val;//error,iconst nt * 无法转换为 int *const void *ptr3 = &val;

(2)不能使用 void* 指针保存 const 对象的地址,而必须使用 const void* 类型的指针保存 const 对象的地址
例子:
const int val = 15;//const对象void *ptr2 = &val;//error,iconst nt * 无法转换为 int *const void *ptr3 = &val;

2.2常指针(const指针)

这种指针变量称为常指针变量,简称常指针,即指针值不能改变。

一般形式:

类型名 * const 指针变量名;

const int *p;

说明:

const限定的是指针变量,任何企图给const指针变量赋值的行为都会导致编译出错,能否通过该指针修改它所指向对象的值,取决于对象本身。

例子:

int a = 12,b = 15;int * const p = &a;//必须在定义时初始化p = &b;  //error,不能改变p的指向*p = 20;  //ok,可以通过指针变量改变指向的内容

总结:

      指针变量的指向不变

2.3指向常量的常指针

一般形式:

const 类型名 * const 指针变量名;

例子:

int a = 12,b = 15;const int * const p = &a;//必须在定义时初始化p = &b;  //error,不能改变p的指向*p = 20;  //error,不能通过p改变a的值a = 20; //ok

总结:

      指向常量的常指针即指针变量指向一个固定的对象,该对象的值不能被改变(不能通过指针变量改变对象的值)。

 3.总结

 那么如何记忆const与指针的关系呢?我们可以从const位于*的位置来记忆,如下:

const int *p = &a;
const在*的左边即表示:不能通过指针p修改其指向的内容

int * const p =&a;
const在*的右边即表示:不能改变指针p的指向,即指针值


 

0 0
原创粉丝点击