zoukankan      html  css  js  c++  java
  • 【C】——指针与const限定符

    const限定符和指针结合起来常见的情况有以下几种。

    const int *a;
    int const *a;

    这两种写法是一样的,a是一个指向const int型的指针,a所指向的内存单元不可改写,所以(*a)++是不允许的,但a可以改写,所以a++是允许的。

    int * const a;

    a是一个指向int型的const指针,*a是可以改写的,但a不允许改写。

    int const * const a;

    a是一个指向const int型的const指针,因此*aa都不允许改写。

    指向非const变量的指针或者非const变量的地址可以传给指向const变量的指针,编译器可以做隐式类型转换,例如:

    char c = 'a';
    const char *pc = &c;

    但是,指向const变量的指针或者const变量的地址不可以传给指向非const变量的指针,以免透过后者意外改写了前者所指向的内存单元,例如对下面的代码编译器会报警告:

    const char c = 'a';
    char *pc = &c;

    即使不用const限定符也能写出功能正确的程序,但良好的编程习惯应该尽可能多地使用const,因为:

    1. const给读代码的人传达非常有用的信息。比如一个函数的参数是const char *,你在调用这个函数时就可以放心地传给它char *const char *指针,而不必担心指针所指的内存单元被改写。

    2. 尽可能多地使用const限定符,把不该变的都声明成只读,这样可以依靠编译器检查程序中的Bug,防止意外改写数据。

    3. const对编译器优化是一个有用的提示,编译器也许会把const变量优化成常量。

    const char **p;表示**p所代表的单元值不可改写;例 **p = ‘a’;就会报错;

    char *const *p;表示*p所代表的单元值不可改写;例

    1     int a;
    2     a = **p;
    3     *p = &a;

    此时第三行就会报错;

    char **const p;表示p的指向不能改变;例

    1     int a = 10;
    2     int *b = &a;
    3     p = &b;

    此时第三行会报错;

  • 相关阅读:
    Convert、Parse、TryParse、(int)区别及可能引发性能问题
    重写、覆盖、重载、多态几个概念的区别分析
    计算机系统的硬件组成(转)
    如何选择Html.RenderPartial和Html.RenderAction
    位运算(转)
    Java程序员面试中的多线程问题
    请转到控制面板来配置或安装系统组件
    开篇
    DropDownList 不能有多个项被选定!
    有关rollup和cube的使用方法讨论
  • 原文地址:https://www.cnblogs.com/ngnetboy/p/3139594.html
Copyright © 2011-2022 走看看