• 指针常量,常量指针


    1、指针常量!它是个常量!
    如:
    int b, c;  
    int * const a = &b;  
    这里a是一个指针常量,它指向变量b。
    因为是指针常量,所以不能再修改它的值,再用a指向其他变量,如 a = &c; 错误!
    但是,可以修改它指向的内容。如:*a = 20;  
    注意: 常量指针声明的时候,必须赋初值,就像const int n=1;一样。

    所谓的名词只是一种说法,原理在这里:
    const int *p = &j;
    int * const p = &j;
    
    用一本经典C/C++语言教程的说法是:
    有指针,有const的语句采用从右向左的读法:
    第一句: const int *p = &j;
    的含义是: p指向整形常量;(*  读作: “指向”)
    
    第二句:int * const p = &j;
    的含义是: p指向常量指针的一个整型值。
    
    再复杂的,都可以这么理解。
     常量指针,也就是本质是指针,什么样的指针呢?常量类型的指针,什么叫常量类型的指针呢?
    回忆一下函数指针,指向函数地址的指针。
    
    那么常量指针,就是指向常量类型地址的指针。
    
    比如const int * p;
    
    而指针常量,本质是常量。
    什么类型的常量?指针类型的常量,为了能够有个术语结构上的对比,你肯定知道整型常量,也知道是这么定义的:const int a;
    
    但指针常量,是这么定义的 : int * const a;
    
    const 在 *前面,是常量指针,const在*后面,是指针常量。
    
    ③这二者的区别就是:
    const int *p 指向的是 const int a=2;的&a;p可以变化但是*p不可以变化。
    而int * const p=&a; 意思是描述的是p,p不可变,就如const int a=2; a的值就不能再改变了。那么p不可以变,但是*p可以变。
    
    还有一种是 综合一起的,const int * const p=&a; 这种一旦确定值,*p和p都不能变化。
    const double *cptr;
    cptr 是一个指向double 类型的const 对象的指针我们可以从右往左把这个定义读为
    cptr 是一个指向double 类型的被定义成const 的对象的指针此中微妙在于cptr 本
    身不是常量我们可以重新赋值cptr 使其指向不同的对象但不能修改cptr 指向的对象
    例如
    const double *pc = 0;
    const double minWage = 9.60;
    // ok: 不能通过pc 修改minWage
    pc = &minWage;
    double dval = 3.14;
    // ok: 不能通过pc 修改dval
    // 虽然dval 本身不是一个常量
    pc = &dval; // ok
    85 第三章 C++数据类型
    dval = 3.14159; // ok
    *pc = 3.14159; // 错误
    const 对象的地址只能赋值给指向const 对象的指针例如pc 但是指向const 对象的
    指针可以被赋以一个非const 对象的地址例如
    C/C++ code
    pc = &dval;
    虽然dval 不是常量但试图通过pc 修改它的值仍会导致编译错误因为在运行程序
    的任意一点上编译器不能确定指针所指的实际对象
    在实际的程序中指向const 的指针常被用作函数的形式参数它作为一个约定来保证
    被传递给函数的实际对象在函数中不会被修改例如
    C/C++ code
    // 在实际的程序中, 指向常量的指针
    // 往往被用作函数参数
    int strcmp( const char *str1, const char *str2 );
    
    在第7 章关于函数的讨论中我们会更多地讨论指向const 对象的指针
    我们可以定义一个const 指针指向一个const 或一个非const 对象例如
    int errNumb = 0;
    int *const curErr = &errNumb;
    
    curErr 是指向一个非const 对象的const 指针我们可以从右拄左把定义读作“curErr
    是一个指向int 类型对象的const 指针”。这意味着不能赋给curErr 其他的地址值但可以
    修改curErr 指向的值
    下面的代码说明我们可以怎样使用curErr
    do_something();
    if ( *curErr ) {
    errorHandler();
    *curErr = 0; // ok: 重置指针所指的对象
    }
    试图给const 指针赋值会在编译时刻被标记为错误
    C/C++ code
    curErr = &myErrNumb; // 错误
    
    指向const 对象的const 指针的定义就是将前面两种定义结合起来例如
    const double pi = 3.14159;
    const double *const pi_ptr = π
    
    在这种情况下pi_ptr 指向的对象的值以及它的地址本身都不能被改变。(我们可以从
    右往左将定义读作“pi_ptr 是指向被定义为const 的double 类型对象的const 指针”。)
  • 相关阅读:
    【FastJSON序列化】FastJSON序列化
    【EsayExcel】EsayExcel生成自定义表头
    时间序列的基础频率
    问题记录 --> 未定义的引用 ||| not found
    linux shell find 用法大全
    pgrep -f abc匹配出含abc的进程 ||||||| pid pkill -f abc
    >/dev/null 2>&1
    编译,发版,链接库问题
    shell 问题 source project_env.sh
    linux/ubuntu 压缩与解压
  • 原文地址:https://www.cnblogs.com/yuanqi/p/3500709.html
Copyright © 2020-2023  润新知