浅谈const int *,int const *与int *const

最近恰好在学习浙江大学翁恺老师的《C语言程序设计》,老师对指针与const的见解颇深,感兴趣可在mooc搜索视频观看9.1-5节

        在开始之前,先介绍一条const的规则:const默认与其左边结合,当左边没有任何东西则与右边结合。(来自知乎:C++里 const int* 与 int const* 有什么区别?)

        那么首先先来谈谈const int *与int const *的区别与联系,由上面的规则其实很容易知道:const int *与int const *其实并无很大区别,可以根据个人编码习惯自行选择。它们都表示“不能通过这个指针去修改那个变量”。不过需要注意的是,这并不能使得那个变量成为const。下面举一个简单例子:

#include 

int main()
{
	const int *p1;
	int const *p2;
	
	const int i = 0;
	int m = 1;
	int n = 2;
	
	p1 = &i;          //p1可以指向const int i
	p1 = &m;          //p1也可以指向int型变量m
    //*p1 = 3;        //[Error] assignment of read-only location '*p1',*p1是只读的
    m = 3;           //直接修改变量m的值是允许的


    int *p3 = &i;     
    /*[Warning] initialization discards 'const' qualifier from pointer target type [enabled             
    by default],把const int的地址交给指向int的指针则会给warning*/

    
	
	p2 = &i;          //p2的结果与p1一致
	p2 = &m;
    //*p2 = 4;        //[Error] assignment of read-only location '*p2'       
    m = 4;
		
	return 0;
} 
    

        由上面代码可以看到,p1和p2既可以指向普通的int型变量,也可以指向const int,但是不能通过指针去修改变量。

        而对于int *const,则是表示“一旦得到了某个变量的地址,不能再指向其他变量”,const此时修饰指针,这也符合上面介绍的规则。下面同样举一个简单例子:

#include 

int main()
{
    int m = 0;
    int n = 0;
    int *const p3 = &m;
    
    *p3 = 1;            //允许通过指针修改变量的值
    m = 1;              //也允许直接修改变量的值
    p3 = &n;            //[Error] assignment of read-only variable 'p3',p3不能指向其他变量
    p3++;               //[Error] increment of read-only variable 'p3',不能对p3做加一操作

    return 0;
}
    

最后总结一下:

浅谈const int *,int const *与int *const_第1张图片

你可能感兴趣的:(c语言,c++)