【问题标题】:is the name of an array an rvalue? [duplicate]数组的名称是右值吗? [复制]
【发布时间】:2012-06-10 16:45:18
【问题描述】:

可能重复:
Is array name a pointer in C?

#include <stdlib.h>
int main(int argc, const char *argv[])
{
    char *b=(char*)malloc(sizeof(char)*50);
    b=(char*)"hello world";
    // works

    char a[50];
    a=(char*)"hello world";
    //doesn't work. why? I thought array names are just pointers that point
    //to the first element of the array (which is char). so isn't a char*?
    return 0;
}

我认为它不起作用的原因是没有一个名为“a”的变量实际上存储了一个 char* 值。那么'a'应该被认为是一个右值吗?我不确定我是否正确理解了这个概念

【问题讨论】:

  • 命名对象始终是左值。
  • 数组不是指针,但您似乎正在尝试使用它。
  • 对这些事情(以及更多)有非常透彻的解释here
  • 请注意,您的第一个示例可以编译,但它不能“工作”!它不会将“hello world”复制到分配的空间中,它只是将b 更改为指向“hello world”字符串。
  • 警告:标签会影响答案。例如,Als 回答 C 时,他说将数组名称传递给函数会导致指针衰减(在 C++ 中,对于采用数组引用的函数来说,它不会)。但“右值”是 C++ 中的一个术语,而不是 C 中的一个术语,它表示“表达式的值”。

标签: c++ c


【解决方案1】:

数组不是指针,有时[注1:]当数组名无效时,数组名衰减为指针(例如:传递给函数)。
数组是不可修改的左值,它们不能被赋值并且可以获取地址。

[注1:]
例如:
数组名在sizeof()中使用时不会衰减为指针

数组地址不能更改,但内容可以更改。

【讨论】:

  • @Luchian:C89 中的“编译时”,不适用于 C99 VLA。它始终是一个运算符,而不是一个函数。
  • @SteveJessop:加油。对于 VLA 的标准要求,sizeof 进行运行时评估。
  • @AlokSave 数组是不可修改的左值,它们不能被赋值——通常是这样,但这个规则也有一个例外:char const str[] = "this will be copied"; 字符串文字是被复制到str的左值char数组。
【解决方案2】:

Array 是一个不可修改的左值。您无法为其分配任何内容,但您可以将一元 &amp; 运算符应用于它。

当您说这里不涉及 char * 变量时,您是对的。数组名直接指一个数组对象——一块连续的内存块,其大小等于元素个数和元素大小的乘积。

【讨论】:

    【解决方案3】:

    我认为数组名只是指针

    不,他们不是。它们是数组。当您将指针作为参数传递时,decay 变成指针,仅此而已。您不能重新分配数组,只能更改单个值。

    【讨论】:

      猜你喜欢
      • 2015-10-13
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      • 2022-11-28
      • 2015-08-18
      • 1970-01-01
      • 2020-01-19
      • 2017-10-18
      相关资源
      最近更新 更多