zoukankan      html  css  js  c++  java
  • 【C_Language】---C语言const用法总结

      C语言关键字const相信对于不少C语言新手是既陌生又熟悉的,好像经常见,但是却不知道为何用,怎么用?学习至此,总结一下const的用法,使用程序来帮助你理解该关键字,希望能帮到像我一样的新手。

      我看了一些参考书,总结了几句话。

      首先,如果别人问你,const的作用是什么,非常简单而且标准不出错的回答是:定义为‘只读’!

      其次,const的难点无非在于,对于变量和指针而言,到底定义了哪一个为只读,作者记忆的方法是:⒈ 看*号在const的左边还是右边,如果是在右边,那么定义就是一个变量只读,如果是在左边,那么就定义了一个指针只读。2.如果单纯的定义了一个只读变量,那么const int a = 3;与int const a = 3;效果相同。

      接下来,举一些例子,来帮助你的记忆理解。

      第一种类型----直接定义一个只读型变量

    1 //定义一个只读变量
    2 void fun1(void)
    3 {
    4     const int a = 1;        //定义一个只读型变量
    5     printf("%d
    ",a); 
    6 //    a = 2;                //该行代码是错误的,因为尝试对一个只读变量进行赋值。
    7     printf("%d
    ",a);
    8 }

      代码非常简单,意图是定义一个只读型变量直接输出一个结果,然后再重新将该变量赋另外一个值,再次输出,注释非常清楚,在此我就不粘贴运行结果了,以后代码同样。

      第二种类型----定义一个指向常型数据的指针(根据我上面讲的规则,你能否猜到这种定义方式--------const int *a)

      首先这种类型的指针,就是数据是常量,不可更改,但是指针可以更改--我列举了三个例子,来佐证这种定义的使用方法。  

      ⒈指针指向一个常量字符串

    1     /*以指针指向字符串为例*/
    2     const char *a = "szhb";
    3     printf("%s
    ",a);
    4 //    a[1] = 'c';            //该行代码错误,因为尝试将常量字符串重新赋值
    5     a = "hello!";
    6     printf("%s
    ",a);

      ⒉指针指向一个数组(两个小例子)

        /*以指针指向数组为例子1*/
        int const a[4] = {0,1,2,3};  //与const int a[4] = {0,1,2,3}效果一样。
      
    int i =0; for(i=0;i<3;i++) { printf("%d",a[i]); } // a[2] = 9; //该语句错误,尝试将只读变量进行重新赋值。 for(i=0;i<3;i++) { printf("%d",a[i]); }
     1     /*以指针指向数组为例子2*/
     2     int a[4] = {0,1,2,3};
     3     int i = 0;
     4     const int *p = a;         //间接将数组a[]的值声明为只读变量。
     5     for(i=0;i<3;i++)
     6     {
     7         printf("%d",p[i]);
     8     }
     9 //    p[2] = 9;                  //该语句错误,尝试将只读变量进行重新赋值。
    10     for(i=0;i<3;i++)
    11     {
    12         printf("%d",p[i]);
    13     }

      第三种类型----定义一个指向整型数据的常指针(根据我上面讲的规则,你能否猜到这种定义方式--------int *const a)

      这种类型的指针,就是数据是变量,可更改,但是指针不可以更改--我也列举了两个例子,来佐证这种定义的使用方法。

      ⒈常指针指向一个字符串

    1 /*定义一个常指针指向一个字符串*/
    2     char *const p = "szhb";
    3     printf("%s
    ",p);
    4 //    p = "hello";       //该条语句错误,因为尝试将一个只读型指针改变指向。
    5     printf("%s
    ",p);

      ⒉常指针指向一个整型变量

    1     int a = 3,b = 4;
    2     int *const p = &a;
    3     printf("%d
    ",*p);
    4 //    p = &b;       //该条语句错误,因为尝试将一个只读型指针改变指向。
    5     printf("%d
    ",*p);

      第四种类型----定义一个指向常型数据的常指针(根据我上面讲的规则,你能否猜到这种定义方式--------const int *const a)

      同上,这种类型的指针和变量,都可更改,举了以下两个例子,来佐证这种定义的使用方法,

      ⒈定义一个指向常型字符串的常指针,二者都不可改变。

        /*定义一个常指针指向一个字符串*/
        const char *const p = "szhb";
        printf("%s
    ",p);
    //    p = "hello";       //该条语句错误,因为尝试将一个只读型指针改变指向。
        printf("%s
    ",p);
    //    p[2] = 'c';        //该条语句错误, 因为尝试改变一个只读型数据。
        printf("%s
    ",p);

      ⒉定义一个指向常型数组的常指针,二者都不可改变。

     1     /*定义一个常指针指向一个数组*/
     2     int  i = 0;
     3     int b[] = {4,5,6};
     4     const int const p[3] = {1,2,3};
     5     for(i=0;i<3;i++)
     6         printf("%d ",p[i]);
     7     printf("
    ");
     8 //    p = b;                 //该条语句错误,因为尝试将一个只读型指针改变指向。
     9     for(i=0;i<3;i++)
    10         printf("%d ",p[i]);
    11     printf("
    ");
    12 //    p[1] = 5;               //该条语句错误, 因为尝试改变一个只读型数据。
    13     for(i=0;i<3;i++)
    14         printf("%d ",p[i]);
    15     printf("
    ");

      以上就是我所总结的关于const的认识和使用,希望能帮到各位初学const的朋友们,以下,是在别人博客上看到的的一些关于const的总结,直接复制过来,勉励你我,共同进步。

    *******************************以下内容来源于@firefly_2002博文***********************************

    总结:

      1.如果const用于定义一个非指针的普通变量,就是定义了一个常变量,这个变量以后的值在生命期内是不能改变的

      2.如果用于修饰函数返回值,效果和修饰变量一样。

    其他:

      1. 必须初始化
          const int i=5; //合法
          const int j; //非法,导致编译错误

      2.在另一连接文件中引用const常量
          extern const int i; //合法
          extern const int j=10; //非法,常量不可以被再次赋值

      3. 是不是const的常量值一定不可以被修改呢?

        观察以下代码:

    1 const int i=0;
    2 int *p=(int*)&i;
    3 *p=100;
    4 printf("%d",i);

         通过强制类型转换,将地址赋给变量,再作修改即可以改变常量值,此时输出的结果i = 100;

  • 相关阅读:
    docker 清理日志文件
    POJ2182 Lost Cows
    POJ3468
    楼兰图腾
    P2024 [NOI2001]食物链
    POJ1733 Parity game
    洛谷P1196 [NOI2002]银河英雄传说
    洛谷P1955 [NOI2015]程序自动分析
    CF 660 C. Uncle Bogdan and Country Happiness
    CF 660A&B
  • 原文地址:https://www.cnblogs.com/szhb-5251/p/5675901.html
Copyright © 2011-2022 走看看