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

Why this code is giving error.......'a' is pointer to character pointer and should store address of 's', since s is pointer to first element to array

本文关键字:指针 存储 地址 因为 第一个 元素 数组 字符 错误 出错 为什么      更新时间:2023-10-16
#include<iostream> 
using namespace std;
int main()
{
    char s[] = "Hello";
    char **a = &s;  //Give compilation error
    cout<<a;
}

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

使用数组s可以使其 decay 到其第一个元素的指针。

当想要指针等于执行&s[0]时,请使用普通s。该指针将具有char *类型。表达式&s是指向 array 的指针,它将具有 char (*)[6]类型。这是非常不同的。

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

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

您的谬误是,您认为在此表达式&s中,数组指定器被隐式转换为指针转换为其第一个元素。但是这样的假设是错误的。

它在C标准(6.3.2.1 LVALUES,数组和功能指定器(中更明确地表示。

3 除非是运算符或Unary的操作数 &amp;操作员,或者是用于初始化数组的字符串 具有"类型的数组"类型的表达式转换为 用类型的"键入指针"的表达式指向初始 数组对象的元素,不是lvalue。如果数组对象 有寄存器存储类,行为不确定。