C++中指针常量和常量指针的区别

     在C++学习使用过程当中,每一个人都不可避免地使用指针,并且都或多或少的接触过常量指针或指针常量,可是对这两个的概念仍是很容易搞糊涂的。函数

本文便是简单描述指针常量和常量指针的区别。学习

常量指针spa

  定义:指针

          又叫常指针,能够理解为常量的指针,也即这个是指针,但指向的是个常量,这个常量是指针的值(地址),而不是地址指向的值。code

     关键点:对象

          1.常量指针指向的对象不能经过这个指针来修改,但是仍然能够经过原来的声明修改;
          2.常量指针能够被赋值为变量的地址,之因此叫常量指针,是限制了经过这个指针修改变量的值;
          3.指针还能够指向别处,由于指针自己只是个变量,能够指向任意地址;blog

 代码形式:内存

          int const* p;  const int* p;class

指针常量
变量

    定义:

         本质是一个常量,而用指针修饰它。指针常量的值是指针,这个值由于是常量,因此不能被赋值。 

    关键点:

          1.它是个常量!
          2.指针所保存的地址能够改变,然而指针所指向的值却不能够改变;
          3.指针自己是常量,指向的地址不能够变化,可是指向的地址所对应的内容能够变化;

  代码形式:

         int* const p;

指向常量的常指针

  定义:

     指向常量的指针常量就是一个常量,且它指向的对象也是一个常量。

   关键点:

        1.一个指针常量,指向的是一个指针对象;

        2.它指向的指针对象且是一个常量,即它指向的对象不能变化;

   代码形式:

        const int* const p;

 

那如何区分这几类呢? 带两个const的确定是指向常量的常指针,很容易理解,主要是如何区分常量指针和指针常量:

一种方式是看 * 和 const 的排列顺序,好比
     int const* p; //const * 即常量指针
     const int* p; //const * 即常量指针
     int* const p; //* const 即指针常量
还一种方式是看const离谁近,即从右往左看,好比
     int const* p; //const修饰的是*p,即*p的内容不可经过p改变,但p不是const,p能够修改,*p不可修改;
     const int* p; //同上
     int* const p; //const修饰的是p,p是指针,p指向的地址不能修改,p不能修改,但*p能够修改;

看代码:

 1     //-------常量指针-------
 2     const int *p1 = &a;
 3     a = 300;     //OK,仍然能够经过原来的声明修改值,
 4     //*p1 = 56;  //Error,*p1是const int的,不可修改,即常量指针不可修改其指向地址
 5     p1 = &b;     //OK,指针还能够指向别处,由于指针只是个变量,能够随意指向;
 6 
 7     //-------指针常量-------//
 8     int*  const p2 = &a;
 9     a = 500;     //OK,仍然能够经过原来的声明修改值,
10     *p2 = 400;   //OK,指针是常量,指向的地址不能够变化,可是指向的地址所对应的内容能够变化
11     //p2 = &b;     //Error,由于p2是const 指针,所以不能改变p2指向的内容
12     
13     //-------指向常量的常量指针-------//
14     const int* const p3 = &a;
15     //*p3 = 1;    //Error
16     //p3 = &b;    //Error
17     a = 5000;    //OK,仍然能够经过原来的声明修改值

 

在实际应用中,常量指针要比指针常量用的多,好比常量指针常常用在函数传参中,以免函数内部修改内容。

size_t strlen(const char* src); //常量指针,src的值不可改变;
char a[] = "hello";
char b[] = "world";
size_t a1 = strlen(a);
size_t b1 = strlen(b);
虽然a、b是能够修改的,可是能够保证在strlen函数内部不会修改a、b的内容。

 

既然讲到了指针,那顺便说一下空指针、野指针的问题。
空指针就是保存地址为空的指针,使用指针时必须先判断是否空指针,不少问题都是这一步致使的。
野指针是在delete掉指针以后,没有置0,致使指针随意指向了一个内存地址,若是继续使用,会形成不可预知的内存错误。

另外指针的误用很容易形成BUG或者内存泄漏。

看代码:

 1     //-------空指针-------//
 2     int *p4 = NULL;
 3     //printf("%d",*p4); //运行Error,使用指针时必须先判断是否空指针
 4 
 5     //-------野指针(悬浮、迷途指针)-------//
 6     int *p5 = new int(5);
 7     delete p5;
 8     p5 = NULL; //必定要有这一步
 9     printf("%d",*p5);  //隐藏bug,delete掉指针后必定要置0,否则指针指向位置不可控,运行中可致使系统挂掉
10     
11     //-------指针的内存泄漏-------//
12     int *p6 = new int(6);
13     p6 = new int(7); //p6本来指向的那块内存还没有释放,结果p6又指向了别处,原来new的内存没法访问,也没法delete了,形成memory leak
相关文章
相关标签/搜索