RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 927324
Accepted
Глеб
Глеб
Asked:2020-12-31 23:11:48 +0000 UTC2020-12-31 23:11:48 +0000 UTC 2020-12-31 23:11:48 +0000 UTC

为什么分配的工作方式不同?

  • 772
int *p = 25;

导致 int <-> int* 转换错误,即使该运算符*是按地址值的。

int a,b,c,d,*p,x,y,z;
*p=25;

效果很好,指针的值为 25,并且变量与其他整数一起声明。为什么?就这样吧,那么 int 和 int* 是不同的数据类型,不应在同一行上指定,但它在示例中起作用int a,b,c,d,*p,x,y,z;,其余变量按应有的方式起作用,而不是作为指针。例如,如果你写int* a, b, c;,那么只有a。为什么下面的代码不起作用?

int *p;
p=&25;
c++
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. AnT stands with Russia
    2021-01-01T00:05:54Z2021-01-01T00:05:54Z

    你的主要错误是相信

    int *p = 25;
    

    有“运算符*”和“赋值”。

    实际上,这种语法中没有“运算符*”和“赋值”。在这种情况下,符号*和符号=只是指针声明语法和初始化语法的元素,与“运算符*”或“赋值”无关。无需尝试在符号之间*、=声明和运算符*以及表达式=中进行比较——这些是完全不同的东西,彼此之间没有任何关系。

    在这个广告中

    int *p = 25;
    

    p被声明为一个指向的指针,int并试图用值初始化这个指针25。这是不允许的。在 C++ 中,没有从 type intin 的值到type 的隐式转换int *。

    但在这种情况下

    int *p;
    *p=25;
    

    yours*p=25不再是声明,而是您已经实际使用 operator和 operator 的表达式。语义是完全不同的。*=


    为什么从您的“int和int*不同的数据类型”(这是正确的)中得出的结论是它们“不应在一行中给出”尚不清楚。C 和 C++ 语言允许您在一行中声明此类变量。是的,没错,int* a, b, c;只是a。C++ 中的声明由公共部分decl-specifier-seq和单独的部分组成declarator

    decl-specifier-seq declarator, declarator, ...;
    

    在您的示例int中decl-specifier-seq,* a、b和c是单独的声明符。


    你的问题是关于“为什么它不起作用”

    int *p;
    p=&25;
    

    不清楚。首先,解释这个问题的来源。为什么他突然要“工作”了?C+ 中的指针指向位于内存中的实体,即 在左值上。25是一个文字,只是一些短暂的浮动值。它在内存中没有位置,不能对其应用地址运算符&。

    • 3
  2. Harry
    2020-12-31T23:49:33Z2020-12-31T23:49:33Z
    int *p = 25;
    

    声明了一个指向intnamed的指针p。尝试将整数值分配给指针违反了处理 C++ 类型的规则。

    int a,b,c,d,*p,x,y,z;
    *p=25;
    

    在类型变量中,int一个指针被声明int为 name p。对一个类型为 的变量(内存位置)进行了赋值,一个类型int为p的变量int- 在不违反类型的情况下,只有变量中的值p是未知的,因此 25 的确切写入位置是未知的。所以程序的行为是未定义的......

    int* a, b, c
    

    *指的是变量名,而不是类型。应该读作

    int (*a), b, c
    

    这里

    int *p;
    p=&25;
    

    您正在尝试从数字而不是变量中获取地址。25 没有与之关联的特定内存位置,至少可以说获取它的地址是一个毫无意义的操作......

    • 2
  3. Best Answer
    Vlad from Moscow
    2021-01-01T01:07:19Z2021-01-01T01:07:19Z
    int *p = 25;
    

    导致 int <-> int* 转换错误,即使 * 运算符用于按地址的值。

    这句话没有使用解引用操作符*。

    该子句是一个指针声明。例如比较以下声明

    int a[1] = { 25 };
    

    同样,这里没有使用索引运算符,[],而是进行了数组声明。

    也就是说,相同的标记根据上下文具有不同的含义。

    编译器对此声明抛出错误

    int *p = 25;
    

    因为没有从25具有类型的整数文字int到指针值类型的隐式转换int *。

    关于本公告

    int a,b,c,d,*p,x,y,z;
    

    那么它可以重写为

    int ( a ), ( b ), ( c ), ( d ), ( *p ), ( x ), ( y ), ( z );
    

    在这种特殊情况下,它相当于一系列声明

    int ( a );
    int ( b ); 
    int ( c );
    int ( d );
    int ( *p );
    int ( x );
    int ( y );
    int ( z );
    

    当然,这更容易写成

    int a;
    int b; 
    int c;
    int d;
    int *p;
    int x;
    int y;
    int z;
    

    一般来说,一个简单的声明(根据 C++ 标准simple-declaration)如下所示:

    decl-specifier-seq init-declarator-list;
    

    也就是说,一系列声明说明符(int、long、bool 等)和一系列声明符(声明的变量)。

    例如,在一个声明子句中,您可以声明一个类型的对象、一个类型int的指针int *、一个具有类型元素的数组int以及一个具有返回类型的函数(或指向函数的指针),int或者甚至int *

    考虑以下演示程序

    #include <iostream>
    
    int f()
    {
        return 10;
    }
    
    int * g()
    {
        static int x = 20;
    
        return &x;
    }
    
    int main() 
    {
        int x, *p, a[1], f(), *g(), ( *pf )() = f, *( *pg )() = g;
    
        p = &x;
        x = 1;
    
        std::cout << "x = " << x << '\n';
    
        ++*p;
    
        std::cout << "*p = " << *p << '\n';
    
        a[0] = x + 1;
    
        std::cout << "a[0] = " << a[0] << '\n';
    
        std::cout << "f() = " << f() << '\n';
        std::cout << "*g() = " << *g() << '\n'; 
        std::cout << "pf() = " << pf() << '\n';
        std::cout << "*pg() = " << *pg() << '\n'; 
    
        return 0;
    }
    

    其输出到控制台:

    x = 1
    *p = 2
    a[0] = 3
    f() = 10
    *g() = 20
    pf() = 10
    *pg() = 20
    

    关于您问题中给定的代码片段

    int a,b,c,d,*p,x,y,z;
    *p=25;
    

    然后第一个声明子句声明了一个名为 p 的指针,如果该变量具有自动内存持续时间(局部变量),因此它具有未定义的值,或者如果该变量具有一个常量空指针,则该指针未初始化静态内存持续时间(在函数外部声明)。

    第二句是表达句。它使用指针取消引用*运算符和赋值运算符。

    由于指针的值要么未定义,要么等于nullptr,因此该子句导致未定义的程序行为。

    关于这个提议

    int *p;
    p=&25;
    

    然后尝试获取整数文字的地址,而不是内存中的对象。因此,编译器会发出错误消息。

    • 2

相关问题

Sidebar

Stats

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

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +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