Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我能';我不明白数组名的意义所在_C_Arrays_Implicit Conversion_Rvalue_Unary Operator - Fatal编程技术网

C 我能';我不明白数组名的意义所在

C 我能';我不明白数组名的意义所在,c,arrays,implicit-conversion,rvalue,unary-operator,C,Arrays,Implicit Conversion,Rvalue,Unary Operator,我最近在这里发布了一些关于数组名称的问题 感谢很多人,现在我知道数组名不是指针,也知道数组名是不可修改的l值 我还有一个关于数组的问题 我被告知数组名被转换为数组第一个元素的地址 所以我知道数组名是这样返回的 int arr[10]; arr == &arr[0]; int arr[10]; arr == &arr[0]; 但是如果它是正确的,它不是一个l值,因为返回的值是一个地址值吗 我还是误会吗 我被告知数组名被转换为数组第一个元素的地址 这是数组标识符出现时表达式求值的

我最近在这里发布了一些关于数组名称的问题

感谢很多人,现在我知道数组名不是指针,也知道数组名是不可修改的l值

我还有一个关于数组的问题

  • 我被告知数组名被转换为数组第一个元素的地址
  • 所以我知道数组名是这样返回的

    int arr[10];
    arr == &arr[0];
    
    int arr[10];
    arr == &arr[0];
    
    但是如果它是正确的,它不是一个l值,因为返回的值是一个地址值吗

    我还是误会吗

    我被告知数组名被转换为数组第一个元素的地址

    这是数组标识符出现时表达式求值的一部分,有少数例外情况

    所以我知道数组名是这样返回的

    int arr[10];
    arr == &arr[0];
    
    int arr[10];
    arr == &arr[0];
    
    指针的自动转换(发生时)类似于表达式
    &arr[0]
    (实际上首先取决于该转换),但在声明数组时将其视为立即且永久执行的转换是不正确的。数组的标识符标识数组,而不仅仅是它的地址或它的第一个元素。特别是,此处自动转换为指针因子的例外情况,特别是如果
    arr
    是数组的标识符,则
    sizeof(arr)
    的计算结果是该数组的大小,而不是指针的大小

    但是如果它是正确的,它不是一个l值,因为返回的值是一个地址值吗


    这是不对的。数组标识符是左值的原因是它指定数组。

    根据C标准(6.3.2其他操作数)

  • 可修改的左值是没有数组类型的左值,没有 具有不完整的类型,但没有 constqualified类型,如果是结构或联合,则没有 任何成员(递归地包括所有 包含的聚合或联合)具有限定类型
  • 3除非它是sizeof运算符或一元数的操作数& 运算符,或是用于初始化数组的字符串文字 类型为“”的数组“”的表达式转换为 类型为“指向类型的指针”且指向初始值的表达式 数组对象的元素,并且不是左值。如果数组对象 已注册存储类,行为未定义

    因此这句话的意思是

    arr == &arr[0];
    
    arr == &arr[0];
    
    看起来像

    &arr[0] == &arr[0];
    
    根据本报价(6.5.3.2地址和间接运算符)

    3一元&运算符产生其操作数的地址…, 结果不是左值

    这是在这个表达式语句中

    arr == &arr[0];
    
    arr == &arr[0];
    

    int[10]
    类型的不可修改左值隐式转换为指向其第一个元素(即
    int*
    类型)的指针,从而获得右值。

    左值是一个可能指定对象别名的值。指针不是它指向的对象的左值,您必须跟随指针,即取消引用它
    arr
    是一个l值。它在许多上下文中衰减为指向其第一个元素的指针,但为l值。您不能更改
    &arr[0]
    (即,
    arr=NULL;
    是非法的)。您可以更改地址
    &arr[0]
    (即
    *(&arr[0])=42;
    (与
    arr[0]=42;
    *arr=42;
    相同)