zoukankan      html  css  js  c++  java
  • 指针和const限定符

    参考:c++ primer p110 指针和const限定符

    const和指针在一起有以下几种情况:

    1 指向const对象的指针

    这就是说指针所指的对象是const类型的,不能通过对指针的解引用修改指向对象的值,以int类型为例,比如:

    const int *p;
    int const *p;

     指向const对象的指针有以下几种特性:

    1. p只是指向const类型的指针,本身并不是const,所以定义时不需要对其进行初始化

    2. 允许给p重新赋值,使其指向另一个const对象,但不能通过p修改其所指的对象的值

    3. 把一个const对象的地址赋给一个普通的,指向非const对象的指针会导致编译错误

    const double pi = 3.14;
    double *ptr = π // error: ptr is a plain pointer
    const double *cptr = π // ok: cptr is a pointer to const

     4 不能使用void *指针保存const对象的地址,而必须使用const void *类型的指针保存const对象的地址

    const int universe = 42;
    const void *cpv = &universe; // ok: cpv is const
    void *pv = &universe; // error: universe is const

    5 允许把非const对象的地址赋给一个指向const对象的指针

    const double * cptr
    double dval = 3.14; // dval is a double; its value can be changed
    cptr = &dval; // ok: but can't change dval through cptr

     这样的话修改dval的值也不能通过指针cptr修改,可以通过不用指针的任何方法修改

    意义:在实际的程序中,指向 const 的指针常用作函数的形参。将形参定义为指向 const 的指针,以此确保传递给函数的实际对象在函数中不因为形参而被修改。

    2 const指针

    指针是const类型,这就意味着指针的值不能修改,不能使用指针指向其他对象,指针必须在定义时初始化,如:

    int errNumb = 0;
    int *const curErr = &errNumb; // curErr is a constant pointer
    curErr = curErr; // error: curErr is const

     指针本身是 const 的事实并没有说明是否能使用该指针修改它所指向对象的值。指针所指对象的值能否修改完全取决于该对象的类型。

    3 指向const对象的const指针

    const double pi = 3.14159;
    // pi_ptr is const and points to a const object
    const double *const pi_ptr = π

     既不能修改 pi_ptr 所指向对象的值,也不允许修改该指针的指向(即 pi_ptr 中存放的地址值)

    4 指针和typedef

    typedef string *pstring;
    const pstring cstr;
    //这个定义等价于:
    string *const cstr; // equivalent to const pstring cstr

     阅读 const 声明语句产生的部分问题,源于 const 限定符既可以放在类型前也可以放在类型后,把声明语句重写为置 const 于类型之后更便于理解

    5 const char *, char const *, char *const的区别

    参考:http://blog.csdn.net/yingxunren/article/details/3968800

    const char * 等价于 char const *

    char * const

    Bjarne在他的The C++ Programming Language里面给出过一个助记的方法:
    把一个声明从右向左读。

    char * const cp; ( * 读成 pointer to )
    cp is a const pointer to char

    const char * p;
    p is a pointer to const char;

    Google的笔试题:

    下面说法正确的是[]
    A.函数foo()不能改变p指向的字符串内容
    B.函数foo()不能使指针p指向malloc生成的地址
    C.函数foo()可以使p指向新的字符串常量
    D.函数foo()可以把p赋值为 NULL.

    答案bcd,能改变指针的值而不能变指针指向的值,因为指向的是const

  • 相关阅读:
    NSClassFromString,NSSelectorFromString,isKingOfClass
    [ios2]10大iOS开发者最喜爱的类库
    [ios2]iphone编程中使用封装的NSLog来打印调试信息 【转】
    [ios2]蓝牙通信【转】
    [ios] Xcode使用设置相关-快捷键【转】
    iOS图片设置圆角
    iOS 时间戳转时间
    iOS 时间转时间戳
    iOS loading等待图
    iOS简便写法
  • 原文地址:https://www.cnblogs.com/raichen/p/5496685.html
Copyright © 2011-2022 走看看