【问题标题】:C++ Array InquiryC++ 数组查询
【发布时间】:2015-06-07 15:37:56
【问题描述】:

为什么我们可以这样做:

char* array = "String";

但不是

int* array = 1;

根据我的理解 * 表示地址,所以我真的不明白为什么我们可以提供非地址值,例如“字符串”。到 char* 数组。

【问题讨论】:

  • * 不代表地址。在你的书中查找指针。
  • 是的,我明白了。它指向一个内存地址,因此我们可以编写如下代码: int a = 1; int* 指针 = &a. &a 是地址,指针指向该地址。我的问题措辞有误,对此深表歉意,但我仍然对为什么 char* 数组可以接受不是地址的值感到困惑。

标签: c++ arrays pointers


【解决方案1】:

char* array表示array是一个变量,可以保存另一个对象的地址(比如另一个变量或常量)。

如果程序有"String",这意味着实际上有一个由7个字符组成的数组存在于内存中的某个地方,它保存着内容"String"

当您编写array = "String"; 时,变量array 将保存该字符串中字母'S' 的地址。

这是因为 C++ 有一个规则,有时称为数组指针衰减,这意味着如果您尝试在预期值的上下文中使用数组(例如 "String"),然后它会自动转换为指向该数组第一个元素的指针。

如果没有该规则,您将不得不写 array = &("String"[0]); 。该规则最初包含在 C 中是为了避免在处理数组时必须到处写 &....[0],尽管事后看来,它似乎产生的痛苦多于快乐。

转到int* i = 1。您说过i 可以保存int 的地址,但您没有提供任何这样的地址。不是数组的变量不会自动转换为它们的地址。事实上1 甚至不是一个变量。我们称它为 prvalue ,它没有任何与之关联的内存存储区域,因此它没有地址。要指向 1 的实例,您必须创建一个变量,例如:

int j = 1; int* i = &j;

【讨论】:

    【解决方案2】:

    * 不代表地址。它的含义是上下文相关的,但大多数时候它意味着指针。

    之所以这样,不工作是因为"String" 是一个字符数组,或者是一个字符的指针。与此相反,1 是一个不是有效地址的文字。你应该写int array = 1,然后你可以写int *brray = &array

    【讨论】:

    • 知道了,你能验证一下我现在有没有这个吗? int 是文字,字符串是指向基本上是 char 数组中第一个字符的地址的指针。
    • @user2814533 字符串文字在 C/C++ 中的行为有点不寻常,但是是的,如果将其用作指针,它就是指向字符数组的指针。
    【解决方案3】:

    * 表示指针,而不是地址。您可以使用& 运算符检索地址。

    char* array = "String";
    

    实际上将array声明为一个字符的指针,声明后的=符号告诉编译器该指针应该拥有什么值。在这种情况下,它是运行程序内存中某处的字符串池中的"String" 地址。

    int* array = 1;
    

    没有像你想象的那样把1 的地址放到array。不过稍微调整一下

    int* array = (int*)1;
    

    ...它可以指向地址1 处的整数,但遗憾的是无法访问。

    【讨论】:

      【解决方案4】:

      这个作业: char* array = "String";
      将“String”分配给内存中的可用位置,并返回“String”在内存中的第一个位置的内存地址。 “array”存放的是“S”的地址。

      这个作业: int* array = 1;
      不起作用,因为您试图将整数分配给指向整数的指针。种类不同

      【讨论】:

        【解决方案5】:

        “我真的不明白为什么我们可以给一个非地址值,比如"String."

        这是因为字符串文字实际上是const char[] 数组,当分配给char* 时,它会衰减为一个指针,而1 不是一个,你不能以任何方式获取它的地址。

        【讨论】:

        • 不,不是。字符串文字的类型是const char[N]。这不是地址。
        猜你喜欢
        • 2013-12-04
        • 2012-01-09
        • 1970-01-01
        • 2020-08-12
        • 2012-07-04
        • 2015-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多