const关键字和指针的纠缠-创新互联

const关键字定义的变量

#includeint  main( void )
{    const int a = 10;

    a = 20;
}12345671234567

结果怎样?

创新互联建站长期为超过千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为新兴企业提供专业的网站制作、做网站,新兴网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。

编译错误

[Error] assignment of read-only variable ‘a’ 变量a是只读的。

得到一个结论,使用const修饰的变量是常量,我们无法修改。在gcc中把const常量放到了data段,和全局变量一样,只是把它放到了一个区域中让我们无法修改,在运行过程中并没有标记const。

了解内容:

三种内存来源: 栈(stack) 堆(heap) 数据区(data)(也就是数据段)
(1)在操作系统专用获取内存的三种方式(C语言程序中): 栈(stack) 堆(heap) 数据区(data)(也就是数据段)

难道const定义的变量真的不能被修改吗?

#includeint  main( void )
{    const int a = 10;    int * p = &a;
    *p = 20;
    printf(" a = %d\n ",a);
}//编译信息:[Warning] initialization discards 'const' qualifier from pointer target type [enabled by default]1234567891012345678910

变量a居然被修改了。。。好神奇。再来深入理解const含义,const定义的变量真的是不能被修改吗?不是的。有时候我们在传输数据的时候,只希望从我家血池传送到地方水晶去,在中途不被干扰,就让const来保驾护航,保护变量a的安全。但是若有一个更强大的英雄(指针)来刺杀变量a,也是有可能的,不仅无视const守卫,还干掉了变量a。

使用const关键字主要是告诉程序员和编译器,这个变量不必要修改,我们的目的是使用它,不是改变它(若要恶意修改也是可以做到的)

注意:
第一次直接给const常量赋值的编译信息是error,第二次通过指针给const常量赋值的编译信息是warning,这也证明了,const常量可以修改,但是一定要注意自己在干什么,也就是说程序员一定要知道自己已经修改了const常量。

const和指针结合

const 修饰指针有4中形式,区分这四种即可理解const和指针。
第一种:const int*p // 指针所指向的变量是常量
第二种:int const *p //指针所指向的变量是常量
第三种:int* const p // 指针p本身是常量
第四种:const int * const p //指针p本身和他所指向的变量都是常量

有点乱哈,记住这句话就好多了

注意区分指针变量本身指针所指向的变量。一个const只能修饰一个变量。

>第一种:const int * p              //  指针所指向的变量是常量
    int a = 10;    int b = 20;    const int * p =&a; 
    //*p = 30;  //const修饰的是指针所指向的变量,所以这行出错
    p = &b;     //指针变量本身是可以修改的>第二种:int  const  *p         //指针所指向的变量是常量
    int a = 10;    int b = 20;    const int * p =&a; 
    //*p = 30;  //const修饰的是指针所指向的变量,所以这行出错
    p = &b;     //指针变量本身是可以修改的上面两种情况都是指针指向的变量是常量不可修改,下面来看指针本身是不可修改的。

>第三种:int* const p           // 指针p本身是常量
    int a = 10;    int b = 20;    int * const p = &a;     //指针指向a
    *p = 30;                //指针指向的变量是可以修改的
    //p = &b;                   //指针p本身是不可修改的>第四种:const int * const p  //指针p本身和他所指向的变量都是常量
    int a = 10;    int b = 20;    const int *const p = &a;    //指针本身和指针指向的变量都是不可修改的
    //*p = 30;      出错
    //p = &b;       出错12345678910111213141516171819202122232425262728291234567891011121314151617181920212223242526272829

怎么区分谁是不可修改的?
分析:

//  第一种:const int*p             //  第二种:int  const *p   //  第三种:int* const p            
//  第四种:const int * const p 12341234

第一种情况:const int*p

const 后面是int*p; int*p是一个整体,是指针指向的变量,所以const 修饰指针指向的变量
第二种:int const *p
const 后面是 *p; *p是指针指向的变量,所以const修饰指针指向的变量

第三种:int* const p

const 后面是 p,p是指针,所以const修饰的是指针本身,而不是它所指向的变量

第四种:const int * const p
先看第二个const得知修饰的是指针,再来看第一个const,和第一种一样了,修饰的指针指向的变量。

学会一步一步的分析,从关键字出发,一步一步来。
const 修饰的变量可以通过指针来修改

const int a = 10;int * p = &a;*p = 20;printf(" a = %d\n",a);12341234
const修饰的指针如何修改?int a = 1;int b = 2;int * const p = &a;//p = &b;   //直接修改肯定会出错,那怎么办?//修改const变量是通过指针,那再通过指针修改指针行不行呢?int a = 1;int b = 2;int **test;int * const p = &a;
test = &p;
*test = &b;
printf("*p = %d\n",*p);     ////*p = 0000000000000002
                            //指针从原来的指向a,变成了现在指向的b123456789101112131415123456789101112131415

总结:
这里用到了二级指针,了解为主,后面我们会深入研究的。这节课的重点是搞清const 与指针的用法,能够区分const修饰的是谁就可以了

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


文章名称:const关键字和指针的纠缠-创新互联
标题网址:http://azwzsj.com/article/cedhdd.html