C++ 为什么此代码给出错误……';a';是指向字符指针的指针,应存储地址为';s';,因为s是指向数组的第一个元素的指针 #包括 使用名称空间std; int main() { char s[]=“你好”; char**a=&s;//给出编译错误 cout

C++ 为什么此代码给出错误……';a';是指向字符指针的指针,应存储地址为';s';,因为s是指向数组的第一个元素的指针 #包括 使用名称空间std; int main() { char s[]=“你好”; char**a=&s;//给出编译错误 cout,c++,C++,使用数组s可以使其衰减为指向其第一个元素的指针 当需要指针时,使用普通的s相当于执行&s[0]。该指针的类型为char*。表达式&s是指向数组的指针,其类型为char(*)[6]。它非常不同。表达式&s是指向类型为char[6]的对象的指针,该类型是数组s的类型 另一方面,类型char**是指向类型char*的对象的指针类型。char[6]和char*是不同的类型。因此指针类型不兼容 您的谬误是,您认为在表达式&s中,数组指示符隐式转换为指向其第一个元素的指针。然而,这种假设是错误的 在C标准(

使用数组
s
可以使其衰减为指向其第一个元素的指针


当需要指针时,使用普通的
s
相当于执行
&s[0]
。该指针的类型为
char*
。表达式
&s
是指向数组的指针,其类型为
char(*)[6]
。它非常不同。

表达式
&s
是指向类型为
char[6]
的对象的指针,该类型是数组
s
的类型

另一方面,类型
char**
是指向类型
char*
的对象的指针类型。
char[6]
char*
是不同的类型。因此指针类型不兼容

您的谬误是,您认为在表达式
&s
中,数组指示符隐式转换为指向其第一个元素的指针。然而,这种假设是错误的

在C标准(63.2.1 LValk、数组和函数标识符)中,比C++标准

更明确地表达 3除非它是sizeof运算符或一元数的操作数 &运算符,或是用于初始化数组的字符串文字,或 类型为“”的数组“”的表达式转换为 类型为“指向类型的指针”且指向初始值的表达式 元素,并且不是左值。如果 已注册存储类,行为未定义


您尝试分配一个
char(*)[6]
指向
字符**
:当你使用
&s
时,你会得到一个指向数组的指针,它显然不同于指向指针的指针。因为你不清楚你到底想做什么,为什么你要
a
指向
char
的指针,你试图解决的实际问题是什么,那么我们真的无法解决请花些时间阅读并思考它与您的问题之间的关系。然后学习如何创建一个,并编辑您的问题,使其与真正的问题相关。谢谢…明白了。。。
#include<iostream> 
using namespace std;

int main()
{
    char s[] = "Hello";
    char **a = &s;  //Give compilation error
    cout<<a;
}