RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 934010
Accepted
wcobalt
wcobalt
Asked:2020-01-19 19:30:01 +0000 UTC2020-01-19 19:30:01 +0000 UTC 2020-01-19 19:30:01 +0000 UTC

对指向非常量的指针赋值,对常量的引用

  • 772

为什么可以做到以下几点?这里发生了什么?

const int& a = 10;
int* b;

*b = a;
c++
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Harry
    2020-01-19T21:02:33Z2020-01-19T21:02:33Z

    我怀疑你对别的东西感兴趣——比如

    const int& a = 10;
    int* b = a;
    

    那些。您想通过指针访问常量值/变量并对其进行修改。如果这是可能的,那么,当然,这将是对安全系统的违反,恒常性——总之,有理由问——为什么会这样?

    但事实是,链接是它所指内容的绝对同义词。而且它不能引用其他东西——它所指的是什么是在创建链接时确定的,并且将其他东西分配给链接结果是一个值的分配——链接本身作为指向某物的指针不会改变。

    你可以写

    const int& a = 10;
    const int * b = &a;
    

    但你不能

    const int& a = 10;
    int * b = &a;
    

    如果这不是您感兴趣的 - 那么我很抱歉,但是您的问题“为什么这可能”指的是完全不可理解的。

    • 3
  2. Best Answer
    Vlad from Moscow
    2020-01-19T21:42:05Z2020-01-19T21:42:05Z

    在这段代码中

    const int& a = 10;
    int* b;
    
    *b = a;
    

    不

    对指向非常量的指针赋值,对常量的引用

    在这段代码中,您试图在未定义的地址处写入内存(因为指针,如果它具有自动内存,则未初始化,或者如果它具有静态内存,则使用空常量初始化)值 10 ,由引用引用a。也就是说,代码片段具有未定义的行为。

    您很可能是指以下代码片段。

    const int& a = 10;
    int *b = &a;
    

    此代码片段尝试使用 引用的 const 对象的地址初始化非 const 指针(即指向非 const 对象的指针)a。

    该代码也被认为是格式错误的,即不符合标准。否则,您可以通过该非常量指针更改 const 对象。

    写是正确的

    const int& a = 10;
    const int *b = &a;
    

    也就是说,引用都是常量,指针指向常量对象。

    下面是一个演示程序。

    #include <iostream>
    
    int main()
    {
        const int& a = 10;
        const int *b = &a;
    
        std::cout << "*b = " << *b << '\n';
    }
    

    其输出到控制台:

    *b = 10
    

    引用和指针都指向一个 const 对象。

    考虑另一个类似的代码。

    #include <iostream>
    #include <iomanip>
    
    int main()
    {
        int i = 10;
    
        const int &a = i;
    
        int *b;
    
        b = &i;
    //  b = &a;
    
        std::cout << "&a == &i is " << ( &a == &i ) 
                  << ", &a == b is " << ( &a == b )
                  << '\n';
    }
    

    在这个程序中,你可以写

    b = &i;
    

    因为指针和指针将引用的对象都是非常量的。

    但是你不能写(这句话在程序中被注释掉了)

    b = &a;
    

    因为在这种情况下,右侧有一个常量引用,即认为该引用引用了一个常量对象,而非常量指针位于左侧。

    但是,引用和指针所引用的对象的地址是相同的,因为它们引用的是同一个对象。

    • 3

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5