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;
你的主要错误是相信
有“运算符*”和“赋值”。
实际上,这种语法中没有“运算符*”和“赋值”。在这种情况下,符号
*和符号=只是指针声明语法和初始化语法的元素,与“运算符*”或“赋值”无关。无需尝试在符号之间*、=声明和运算符*以及表达式=中进行比较——这些是完全不同的东西,彼此之间没有任何关系。在这个广告中
p被声明为一个指向的指针,int并试图用值初始化这个指针25。这是不允许的。在 C++ 中,没有从 typeintin 的值到type 的隐式转换int *。但在这种情况下
yours
*p=25不再是声明,而是您已经实际使用 operator和 operator 的表达式。语义是完全不同的。*=为什么从您的“
int和int*不同的数据类型”(这是正确的)中得出的结论是它们“不应在一行中给出”尚不清楚。C 和 C++ 语言允许您在一行中声明此类变量。是的,没错,int* a, b, c;只是a。C++ 中的声明由公共部分decl-specifier-seq和单独的部分组成declarator在您的示例
int中decl-specifier-seq,* a、b和c是单独的声明符。你的问题是关于“为什么它不起作用”
不清楚。首先,解释这个问题的来源。为什么他突然要“工作”了?C+ 中的指针指向位于内存中的实体,即 在左值上。
25是一个文字,只是一些短暂的浮动值。它在内存中没有位置,不能对其应用地址运算符&。声明了一个指向
intnamed的指针p。尝试将整数值分配给指针违反了处理 C++ 类型的规则。在类型变量中,
int一个指针被声明int为 namep。对一个类型为 的变量(内存位置)进行了赋值,一个类型int为p的变量int- 在不违反类型的情况下,只有变量中的值p是未知的,因此 25 的确切写入位置是未知的。所以程序的行为是未定义的......*指的是变量名,而不是类型。应该读作这里
您正在尝试从数字而不是变量中获取地址。25 没有与之关联的特定内存位置,至少可以说获取它的地址是一个毫无意义的操作......
这句话没有使用解引用操作符
*。该子句是一个指针声明。例如比较以下声明
同样,这里没有使用索引运算符,
[],而是进行了数组声明。也就是说,相同的标记根据上下文具有不同的含义。
编译器对此声明抛出错误
因为没有从
25具有类型的整数文字int到指针值类型的隐式转换int *。关于本公告
那么它可以重写为
在这种特殊情况下,它相当于一系列声明
当然,这更容易写成
一般来说,一个简单的声明(根据 C++ 标准simple-declaration)如下所示:
也就是说,一系列声明说明符(int、long、bool 等)和一系列声明符(声明的变量)。
例如,在一个声明子句中,您可以声明一个类型的对象、一个类型
int的指针int *、一个具有类型元素的数组int以及一个具有返回类型的函数(或指向函数的指针),int或者甚至int *考虑以下演示程序
其输出到控制台:
关于您问题中给定的代码片段
然后第一个声明子句声明了一个名为 p 的指针,如果该变量具有自动内存持续时间(局部变量),因此它具有未定义的值,或者如果该变量具有一个常量空指针,则该指针未初始化静态内存持续时间(在函数外部声明)。
第二句是表达句。它使用指针取消引用
*运算符和赋值运算符。由于指针的值要么未定义,要么等于
nullptr,因此该子句导致未定义的程序行为。关于这个提议
然后尝试获取整数文字的地址,而不是内存中的对象。因此,编译器会发出错误消息。