为什么这段代码会给出错误.......'a'是指向字符指针的指针,应该存储's'的地址,因为s是指向第一个元素到数组的指针

时间:2017-06-25 15:23:59

标签: c++

#include<iostream> 
using namespace std;

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

由于s是指向第一个元素的指针,我应该能够将其地址存储在指向字符指针变量的指针中。但是它显示错误。

2 个答案:

答案 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   具有类型''数组类型''的表达式将转换为   带有''指向类型'的指针的表达式,指向初始值   数组对象的元素,而不是左值。如果是数组对象   具有寄存器存储类,行为未定义。