Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2993307
  • 博文数量: 272
  • 博客积分: 5544
  • 博客等级: 大校
  • 技术积分: 5496
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 00:48
个人简介

  每个人都要有一个骨灰级的爱好,不为金钱,而纯粹是为了在这个领域享受追寻真理的快乐。

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: C/C++

2011-09-17 16:07:39


    在我们的C语言中,下面的操作很简单的对一个整形变量进行定义、初始化、赋值:
  1. #include<stdio.h>

  2. int main(void)
  3. {
  4.     int i = 40;
  5.     i = 80;
  6.     printf("%d\n", i); //输出结果为80
  7.     return 0;
  8. }

    当需要定义一个常量的时候,这时候会有很多混淆不清的情况,下面我们将逐一的来分析解惑。
    在C语言中要对一个常量进行定义,需要用到 const 关键字:
  1. int main(void)
  2. {
  3.     int const i = 40;
  4.     i = 80;
  5.     printf("%d\n", i); //编译报错
  6.     return 0;
  7. }
这时候,我们再对 i 变量(应该叫常量了)进行赋值时,系统编译就会报错了。因为 const 不允许该常量再被重新的赋值了。“const int i”与“int const i” 是没有任何区别的,我们再看下一种情况:
  1. int main(void)
  2. {
  3.     const int i = 40;
  4.     int *p;
  5.     p = &i;
  6.     printf("%d\n", i); //编译报错
  7.     return 0;
  8. }
我们对i常量进行取地址的时候编译也是会报错的,因为取得了i的地址,那意味着可以用指针对其值进行修改,这也是我们语言不允许的情况。当然我们的C语言是支持强制类型转换的:
  1. int main(void)
  2. {
  3.     const int i = 40;
  4.     int *p;
  5.     p = (int*)&i;
  6.     *p = 80;
  7.     printf("*p = %d, i = %d\n", *p, i) //输出结果:*= 80, i = 40
  8.     return 0;
  9. }
强制讲指针p指向i的地址,然后给*p进行赋值,编译不会报错,但是实际上并没有修改i的值。大家仔细对下面的操作,没有const定义,我们是可以通过指针对i变量的值进行修改的。体会const对常量的影响:
  1. int main(void)
  2. {
  3.     int i = 40;
  4.     int *p;
  5.     p = &i;
  6.     *p = 80;
  7.     printf("*p = %d, i = %d\n", *p, i); //输出结果:*p = 80, i = 80
  8.     return 0;
  9. }
    总结:const 定义的常量,我们通过赋值,指针修改,都无法改变其初始化的值。



    接下来看看 const 对指针的问题,我们说过 const 在数据类型之前或之后是没差别的,那么指针定义的时候也是如此,比如 “int const *p”和“const int *p”都是对*p进行定义的,是一样的效果。
    但是大家“int const *p”和“int *const p”的情况则差别就很大了,下面我们将举例分别说明:
  1. // int const *p

  2. int main(void)
  3. {
  4. int i = 40;
  5. int const *p;
  6. p = &i;
  7. *p = 80; /* 编译报错,可以把p指向i的地址,而不能对*p进行赋值.
  8.             因为const定义的是*p. 可以对p操作,而不能对*p进行操作
  9.             注释该行后,输出结果为40 */
  10. printf("%d\n", *p);
  11. return 0;
  12. }


  13. /int *const p

  14. int main(void)
  15. {
  16. int i = 40, j = 80;
  17. int *const p = &i;
  18. p = &j; /* 编译报错,同样的道理,const对p的定义,造成了我们无法再把指针p指向其它地址.
  19.            但是我们又可以对*p进行操作,赋予其它变量的值给它,
  20.            注释该行后输出结果为80 */
  21. *p = j;
  22. printf("%d\n", *p);
  23. return 0;
  24. }

    // const int *const p
    //这个就不说了吧,p和*p都无法再修改.







阅读(2395) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

zooyo2011-09-20 23:00:12

我的归魂: XX@XX-server:~/98_tmp$ cat const.c
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  const int value = 40;
  int *p;
  p=&value;.....
这个问题我是在VC++6.0下调试的,不同的软件会有一些细小的差别.也不需要您大驾来鉴定什么兰州烧饼.自重.

我的归魂2011-09-20 14:02:46

XX@XX-server:~/98_tmp$ cat const.c
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  const int value = 40;
  int *p;
  p=&value;
  printf("value: %d\n",value);
  printf("*p: %d\n",*p);
  *p = 20;
  printf("value: %d\n",value);
  printf("*p: %d\n",*p);
}