#include<iostream>
using namespace std;
int main()
{
char s[] = "Hello";
char **a = &s; //Give compilation error
cout<<a;
}
由于s是指向第一个元素的指针,我应该能够将其地址存储在指向字符指针变量的指针中。但是它显示错误。
答案 0 :(得分:2)
使用数组s
可以使衰减指向其第一个元素的指针。
当需要指针时使用普通s
等于执行&s[0]
。该指针将具有类型char *
。表达式&s
是指向数组的指针,它的类型为char (*)[6]
。情况非常不同。
答案 1 :(得分:1)
表达式&s
是指向char[6]
类型对象的指针,该对象是数组s
的类型。
另一方面,类型char **
是类型为char *
的对象的指针类型。类型char[6]
和char *
是不同的类型。因此指针类型不兼容。
你的谬论是你认为在这个表达式&s
中,数组指示符被隐式转换为指向其第一个元素的指针。然而,这样的假设是错误的。
在C标准(6.3.2.1 Lvalues,数组和函数指示符)中比在C ++标准中更明确地表达
3 除非是sizeof运算符或一元运算符的操作数 &安培; operator ,或者是用于初始化数组的字符串文字,a 具有类型''数组类型''的表达式将转换为 带有''指向类型'的指针的表达式,指向初始值 数组对象的元素,而不是左值。如果是数组对象 具有寄存器存储类,行为未定义。