zoukankan      html  css  js  c++  java
  • const修饰的双重指针赋值解惑

    在c程序中,我们可能经常会使用到指针之间的赋值。

    传统的赋值操作:

    char *cp = "c";
    const char *ccp;
    ccp = cp;
    printf("*ccp:%c",*ccp);

    会正常打印出*cpp所指的字符。但是下面的这段代码,就会出现问题:

    char **c = &cp;
    const char **cc;
    cc = c;
    printf("**cc:%c",**cc);

    编译的时候提示,出现错误:

    1>------ 已启动生成: 项目: oj1511, 配置: Debug Win32 ------
    1>生成启动时间为 2014/4/9 10:48:221>InitializeBuildStatus:
    1>  正在创建“Debugoj1511.unsuccessfulbuild”,因为已指定“AlwaysCreate”。
    1>ClCompile:
    1>  oj1510.cpp
    1>e:workspaceoj1511oj1511oj1510.cpp(11): error C2440: “=”: 无法从“char **”转换为“const char **1>          转换丢失限定符
    1>
    1>生成失败。
    1>
    1>已用时间 00:00:00.36
    ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

    这是为什么呢?


    原来还是const修订符搞的怪:

    第一段代码中:

    cp是一个指向char类型的指针。

    ccp是一个const修饰符修饰的指向char类型的指针,也就是说,它指向的是char类型,但是指针本身是不可修改的。

    在ANSI C标准中,有这么一段:

    两个操作数都是指向有限定符或无限定符的相容类型的指针,左边的指针所指向的类型必须具有右边的全部限定符。

    也就是说: ccp是一个指向有const修饰符的指针,cp是一个指向没有const修饰符的指针。ccp中包含了cp的所有修饰符(其实cp就没啥修饰符),因此可以进行赋值。

    这样,我们看一下面的代码:

    c是一个指向char类型指针的指针。

    cc是一个指向const修饰符修饰的char类型的指针的指针。

    cc 与 c指向的内容并不相同,因此无法进行赋值操作。因此出现提示错误:error C2440: “=”: 无法从“char **”转换为“const char **”

  • 相关阅读:
    bootstrap-15
    sqlserver 根据指定值截取字符串
    idea针对有外联jar包的项目如何编译成可运行的jar包
    中控考勤机超级管理员密码算法
    sql server 取多条数据的最大值
    bat 脚本定时删除备份文件
    Spyder汉化教程
    君荣一卡通软件mysql转sqlserver 教程
    office2016专业增强版激活密匙 (shell激活版)
    sql 获取当前时间的前一天,不加时分秒
  • 原文地址:https://www.cnblogs.com/xing901022/p/3653708.html
Copyright © 2011-2022 走看看