C 语言的关键字 const详解

来源:互联网 发布:大乐网络 编辑:程序博客网 时间:2024/05/12 02:17

                              C 语言的关键字 const详解

1, 基本的const
1.1 const和变量的初始化
    如果在定义const自动变量时没有进行初始化,
那么就没法直接进行初始化,而只能通过指针间接进行初始化。

int
main()   
{
    const int a;
    a = 9;       
    //这里无法通过编译
    //错误:向只读变量 ‘a’ 赋值
    //但如果写成这样 const int a = 9;将顺利通过编译。   

    return 0;
}

1.2 以下定义是相同的

int const a = 9;
const int a = 9;

记住:const和基本自动变量使用,定义时可以交换位置。
      在和指针一起定义某个变量时,不能交换。


1.3 const并非无法修改
    无法直接修改const的变量,但可以通过指针的方式
间接修改。

void
test1(void)
{
    int *pi;
    int const a = 9;
   
    printf("int const a = %d/n", a);
    pi = &a;
    *pi = 2;
    printf("haha, I change it a = %d/n", a);   
}


2, const 和指针
    const和指针在一起使用时,容易搞混,
    在网上找到一个识别的方法觉得用起来很不错:
    舍弃法识破const。
    1)首先舍弃const, 得到一个普通的声明;
    2)若有多个const从最左边的const开始去。
    3)然后舍弃const右面的const标志以及其它的关键字;
    4)接下来就是将const右面所有的*和变量用一个新变量代替,
        单个字符不用被取代,那么这个新变量就是const作用对象。

下面先给出这几个表达式的解释,后面用例子说明。
const int *A;          //修饰指向的对象,A可变,A指向的对象不可变
int const *A;       //修饰指向的对象,A可变,A指向的对象不可变
int *const A;       //修饰指针A, A不可变,A指向的对象可变
const int *const A; //指针A和A指向的对象都不可变

2.1 const int *A;和 int const *A;
    按照上面的3条,这两个的表达式的作用应该是一样的。
    const的作用对象应该是*A这个整体。也就是作用于A指向的变量的值。
   
 61 void
 62 test4(void)
 63 {
 64         int num=12;
 65         const int *A=#
 66         (*A)++;     //error: 令只读位置自增
 67         printf("result=%d/n",*A);
 68 }
    61-68行可以看出,const int *A的确修饰的是*A这个整体,也就是
指针指向的值。 
    下面的这个例子说明了,虽然无法改变*A的值,但是可以改变A指针本身。

 71 void
 72 test5(void)
 73 {
 74     int a[] = {1,2,3,4,5};
 75     const int *ar = &a;
 76
 77     *ar++;                  //ok
 78     printf("result=%d/n",*ar);    //result=2
 79 }
   
2.2  int *const a; 和 const *int a;
   
    const *int a;     //这样的定义格式是错误的,指针不知道是什么类型。
   
    int *const a;
    按照上面的规则我可以判断,该const是修饰的a,而a被定义为一个指针。
所以他限定的对象是a这个指针。也就是说a的指针值不能修改。
       
#include<stdio.h>
int
main(void)
{
    int a[] = {1,2,3,4,5};
    int *const ar = a;

    *ar++;                  //error
    //若是这样写,就对了:
    //*ar = 9;            // ok
    printf("result=%d/n",*ar);  //result=2
        return 0;
}
   
编译无法通过,出现错误:
test2.c: In function ‘main’:
test2.c:9: 错误:令只读变量 ‘ar’ 自增

2.3 const int *const a; //指针A和A指向的对象都不可变
    通过分析知道,该定义中const限制了*a和a。也就是这
两个(作为整体)都不能改变。

  1 #include<stdio.h>
  2
  3 int
  4 main(void)
  5 {
  6     int a[] = {1,2,3,4,5};
  7     const int *const ar = a;
  8
  9     //*ar++;                  //error
 10     *ar = 9;            // error
 11     printf("result=%d/n",*ar);  //result=2
 12     return 0;
 13 }
   

3, 作为参数时的const
 17 void
 18 testpc(const char *s, const int *a)
 19 {
 20     if (*a == 3) {
 21         a = 0;      //改变其地址允许
 22         s[1] = "a"; //改变*s的值,出错
 23     }
 24 }

    根据规则,这样的赋值是错误的,但如果改变其地址却可以。
const int *a;的意思是不能改变 *a这个整体的值。

原创粉丝点击