5.常量指针和指针常量的区别-灵析社区

菜鸟码转

1.常量指针:

常量指针本质上是个指针,只不过这个指针指向的对象是常量。

特点:const 的位置在指针声明运算符 * 的左侧。只要 const 位于 * 的左侧,无论它在类型名的左边或右边,都表示指向常量的指针。(可以这样理解:* 左侧表示指针指向的对象,该对象为常量,那么该指针为常量指针。)

C++

const int * p;
int const * p;
  • 注意 1:指针指向的对象不能通过这个指针来修改,也就是说常量指针可以被赋值为变量的地址,之所以叫做常量指针,是限制了通过这个指针修改变量的值。

例如:

C++

#include <iostream>
using namespace std;

int main()
{
    const int c_var = 8;
    const int *p = &c_var; 
    *p = 6;            // error: assignment of read-only location '* p'
    return 0;
}
  • 注意 2:虽然常量指针指向的对象不能变化,可是因为常量指针本身是一个变量,因此,可以被重新赋值。

例如:

C++

#include <iostream>
using namespace std;

int main()
{
    const int c_var1 = 8;
    const int c_var2 = 8;
    const int *p = &c_var1; 
    p = &c_var2;
    return 0;
}

2.指针常量:

指针常量的本质上是个常量,只不过这个常量的值是一个指针。

特点:const 位于指针声明操作符右侧,表明该对象本身是一个常量,* 左侧表示该指针指向的类型,即以 * 为分界线,其左侧表示指针指向的类型,右侧表示指针本身的性质。

C++

const int var;
int * const c_p = &var; 

注意 1:指针常量的值是指针,这个值因为是常量,所以指针本身不能改变。

C++

#include <iostream>
using namespace std;

int main()
{
    int var, var1;
    int * const c_p = &var;
    c_p = &var1; // error: assignment of read-only variable 'c_p'
    return 0;
}
  • 注意 2:指针的内容可以改变。

C++

#include <iostream>
using namespace std;

int main()
{
    int var = 3;
    int * const c_p = &var;
    *c_p = 12; 
    return 0;
}

3.指向常量的指针常量:

指向常量的指针常量,指针的指向不可修改,指针所指的内存区域中的值也不可修改。

C++

#include <iostream>
using namespace std;

int main()
{
    int var, var1;
    const int * const c_p = &var;
    c_p = &var1; // error: assignment of read-only variable 'c_p'
    *c_p = 12; // error: assignment of read-only location '*c_p'
    return 0;
}

4.部分特例:

根据前三部分的结论,我们可以得到以下代码的表示内容:

C++

int ** const p;  // p 是一指针常量,它是一个指向指针的指针常量;
int * const * p; // p 是一个指针,它是一个指向指针常量的指针;
int const ** p;  // p 是一个指针,它是一个指向常量的指针的指针;
int * const * const p; // p 是一指针常量,它是一个指向指针常量的指针常量;


阅读量:2016

点赞量:0

收藏量:0