C语言-入门-const关键字(十九)

x33g5p2x  于2022-08-17 转载在 其他  
字(2.0k)|赞(0)|评价(0)|浏览(409)

前沿

const是constant的简写,用来定义常量,它限定一个变量不允许被改变,产生静态作用。const最开始推出的目的是为了取代预编译指令,取长补短。好处如下:

  1. 定义const常量,具有不可变性
  2. 便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。
  3. 可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。
  4. 可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。
  5. 可以节省空间,避免不必要的内存分配。
  6. 高了效率。编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表 中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

如何使用const?

常量一般常量是指简单类型的常量。这种常量在定义时,修饰符const可以用在类型说明符前,也可以用在类型说明符后

int const x=2; 
//或 
const int x=2;

当然,我们可以偷梁换柱进行更新: 通过强制类型转换,将地址赋给变量,再作修改即可以改变const常量值

// const对于基本数据类型, 无论写在左边还是右边, 变量中的值不能改变
    const int a = 5;
    // a = 666; // 直接修改会报错
    // 偷梁换柱, 利用指针指向变量
    int *p;
    p = &a;
    // 利用指针间接修改变量中的值
    *p = 10;
    printf("%d\n", a); 
    printf("%d\n", *p);

修饰常数组(值不能够再改变了)定义或说明一个常数组可采用如下格式:

int const a[5]={1, 2, 3, 4, 5};
const int a[5]={1, 2, 3, 4, 5};

修饰函数的常参数const修饰符也可以修饰函数的传递参数,告诉编译器Var在函数体中的无法改变,从而防止了使用者的一些无 意的或错误的修改。

void Fun(const int var){
//函数内部只是读取var 不能修改var
}

修饰函数的返回值: const修饰符也可以修饰函数的返回值,使得调用者不能修改函数返回值,格式如下:

const int Fun1();
const MyClass Fun2();

修饰指针
使用const修饰指针不同位置会导致不同的变化

const int *A; //const修饰指针,A可变,A指向的值不能被修改
int const *A; //const修饰指向的对象,A可变,A指向的对象不可变
int *const A; //const修饰指针A, A不可变,A指向的对象可变
const int *const A;//指针A和A指向的对象都不可变

技巧:

  • 先看*的位置
  • 如果const 在 *的左侧 表示值不能修改,但是指向可以改。
  • 如果const 在 *的右侧 表示指向不能改,但是值可以改
  • 如果在*的两侧都有const 标识指向和值都不能改。

修饰全局变量

全局变量的作用域是整个文件,且全局变量的生存周期为程序运行的整个过程,所以我们应该尽量避免使用全局变量,一旦某个函数改变了全局变量的值,会影响到其他引用这个变量的函数,是一个很隐蔽的操作(很难找到谁改的)如果一定要用全局变量,应该尽量的使用const进行修饰,防止不必要的人为修改

typedef和#define常亮操作不同

typedef   int * pint;
#define  PINT  int *
int main(int argc, char* argv[])
{
    int i1 = 1, i2 = 2;
    const  pint a=&i1;   //p1本身地址不可更改,p1指向的内容可以更改
    const  PINT b=&i2;//p2本身地址可以更改, p2指向的内容不能更改

//    *a=3; //换内容是可以的
//    a=&i2; //换地址不行 Cannot assign to variable 'a' with const-qualified type 'const pint' (aka 'int *const')
    printf("%d\n", *a);

//    b=&i2;  // 换地址是可以的
//    *b=1; //换内容不行 ,Read-only variable is not assignable
    printf("%d\n", *b);
    return 0;
}

所以建议在使用typedef 定义指针的时候就指定const 比如:typedef const int * pint; 这样之后在使用的时候就不能改变地址内的值了

点赞 -收藏-关注-便于以后复习和收到最新内容有其他问题在评论区讨论-或者私信我-收到会在第一时间回复在本博客学习的技术不得以任何方式直接或者间接的从事违反中华人民共和国法律,内容仅供学习、交流与参考免责声明:本文部分素材来源于网络,版权归原创者所有,如存在文章/图片/音视频等使用不当的情况,请随时私信联系我、以迅速采取适当措施,避免给双方造成不必要的经济损失。感谢,配合,希望我的努力对你有帮助^_^

相关文章

微信公众号

最新文章

更多