娓娓道来c指针 (6)const的使用

(6)const的使用

c中的const表达着“常量”的意思,更准确地说是“read-only”(只读)的含义。当const与指针相遇时,由于其与*的相对位置不同,会产生不一样的效果。

举例说明

(1)const位于*的左侧

如,const int *p;此时等同于int const *p;

此时,const的含义体现在:*p是只读的。

(1)const位于*的右侧

如,int *const p;

此时,const的含义体现在:p是只读的。

实验验证

  1. int main()  
  2. {  
  3.     int foo = 1;  
  4.     int bar = 2;  
  5.     const int *pa = &foo;  
  6.     int *const pb = &foo;  
  7.     //尝试修改值  
  8.     *pa = 2;    //编译器报错:“表达时必须是可修改的左值”  
  9.     pb = &bar;  //编译器报错:“表达时必须是可修改的左值”  
  10.     return 0;  
  11. }  


此时,添加语句*pa=2;会报错,因为*pa是只读的,不可更改;pb=&bar;同样会报错,因为pb是只读的,不可更改。


上面提到,const的本意是“只读”,而并非“常量”。通过一些方法,可以更改它的值。

  1. int main()  
  2. {  
  3.     const int foo = 1;  
  4.     printf("foo...%d\n", foo);  
  5.     int *pa = &foo;  //这里有警告,但仍可运行  
  6.     *pa = 2;  
  7.     printf("foo...%d\n", foo);  
  8.     system("pause");  
  9.     return 0;  
  10. }  

运行



从结果看,成功更改了本已声明为只读的foo。这段代码,在c中编译只是有警告,在cpp下编译直接出错。如果写成int *pa = (int *)&foo; 这是连警告都没有!不知还有没有其它的方法,大家可推荐下。


const与结构体类型相遇,此时const会const到什么程度?

  1. typedef struct  
  2. {  
  3.     char *name;  
  4.     char *address;  
  5.     int age;  
  6. }Person;  
  7. void setPerson(const Person* pPer)  
  8. {  
  9.     /*以下方式会出错! 
  10.     pPer->name = "David"; 
  11.     pPer->address = "BeiJing"; 
  12.     pPer->age = 22; 
  13.     */  
  14.     strcpy(pPer->name, sizeof("David"), "David");  
  15.     strcpy(pPer->address, sizeof("BeiJing"), "BeiJing");  
  16. }  
  17. int main()  
  18. {  
  19.     Person per;  
  20.     char name[10] = "zx";  
  21.     char address[20] = "QiChun";  
  22.     per.name = name;  
  23.     per.address = address;  
  24.     per.age = 24;  
  25.     printf("per.name...%s\n", per.name);  
  26.     printf("per.address...%s\n", per.address);  
  27.     printf("per.age...%d\n", per.age);  
  28.     printf("update..\n");  
  29.     setPerson(&per);  
  30.     printf("per.name...%s\n", per.name);  
  31.     printf("per.address...%s\n", per.address);  
  32.     printf("per.age...%d\n", per.age);  
  33.     return 0;  
  34. }  

运行

编译时无任何警告,从运行结果看,const修饰符起到的作用是这样的:


若直接初始化 per = { "zx", "QiChun" };则在setPerson()方法中,修改name和address所指向的内容也是不可以的。这里的原因不是因为const,而是"zx"和"QiChun"都是常量字符串。一般情况下,常量字符串都位于内存中的只读区域,本身是不可修改的。故在代码中,我们选择申请栈空间。



专栏目录:

posted @ 2017-11-19 21:48  立体风  阅读(177)  评论(0编辑  收藏  举报