分享

const int *p与 int *const p区别

 XX_YY_ZZ 2015-10-22

/********************************************************************
2013年5月6日13:19:57
该例子说明几个问题
1. const int *p语义:
(1) const 修饰的是整个*p,所以*p是个常量,是不能被赋值的。
(2) p前并没有用const修饰,所以p是指针变量,能被赋值重新指向另一个内存地址。
(3) int const *p 与 const int *p完全相同。
2. int *const p语义:
(1) p因为有了const修饰,所以p值是不可修改的。
(2) 整个*p的前面没有const的修饰,也就是说,*p是变量,所以可以通过*p来修改它所指内存的值。
3. 总结:
(1) 如果const修饰在*p前,则不能改的是*p,p的值可以修改。
(2) 如果const是直接写在p前面,则p不能改,*p的值可以修改。
4. 两个基础概念: 指针常量和常量指针(重点要分清总结的两句话,至于叫什么,知道就行,不必深究)
(1) 指针常量: 即指针本身的值是不可改变的,而指针指向的变量的值是可以改变的;
(2) 常量指针: 即指针指向的变量的值是不可改变的,而指针本身的值是可以改变的;

原文:彻底搞定C指针-姚云飞

测试环境vc6.0
********************************************************************/



#include <stdio.h>


int main(void)
{
int i = 30;
int j = 40;

//==================================test const int *p==================================
/*const int *p = &i;

p = &j; //ok
//*p = 80; //error
j = 80;
printf("%d\n", *p);*/


//==================================test int *const==================================
/*int *const p = &i;
//p = &i2; //error
*p = 80;
printf("%d\n", i);*/


//========================情况1:int *p指针指向const int i常量========================
/*const int a = 40;
//int *p = &a; //error: cannot convert from 'const int *' to 'int *',否则p岂不是能修改a的值了吗
int *p = (int *)&a; //ok
*p = 80;
printf("a = %d\n", a); //a还是40
printf("*p = %d\n", *p); //*p = 80*/

//========================const int *p指针指向const int i=============================
/*const int b = 40;
const int *p = &b; //ok
//*p = 80; //error
//b = 80; //error*/

//========================用const int *const p声明的指针==============================
int c = 10;
int d = 20;
const int * const p = &c; //p的值不能改,也不能通过p修改c的值
//*p = 80; //error
//p = &d; //error

return 0;
}



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多