【问题标题】:C++ - The name of the array and the starting addressC++ - 数组的名称和起始地址
【发布时间】:2011-01-20 09:08:36
【问题描述】:

在第(7)章的C++无所畏惧:让你感到聪明的初学者指南中,提到了以下内容:

char str[10] = "Hello!";

此声明创建显示的数组,并关联起始地址 与 str。 (请记住,数组的名称总是翻译成它的起始 地址。)

这是什么意思?我的意思是,起始地址与str的关联?

谢谢。

【问题讨论】:

  • 这基本上意味着书的作者不知道他/她在说什么。啊!数组不是指针,作者什么时候知道!

标签: c++ string char


【解决方案1】:

这意味着'str'可以被视为存储“Hello”字符串的起始地址。

因此 str + 1 是存储字符串第二个字符的地址。

  |   str   | str+1  | str+2  | str+3 | str+4 | str+5  |
  |  str[0] | str[1] | str[2] | str[3]| str[4]| str[5] |
  |    H    |  e     |   l    |   l   |   o   |  \0    |

【讨论】:

    【解决方案2】:

    这是什么意思?

    此声明创建显示的数组,并将起始地址与 str 相关联。

    这意味着

    1. 在内存中构造一个数组,填充"Hello!"的内容(即字符'H''e''l''l''o''!'、@987654328 @)
    2. 创建了一个指针变量str,指向之前创建的数组的起始地址。

    但是,这是错误的。书中的描述是错误的,或者至少是严重误导。

    str 不是指针,它是数组。因此,它不是“与起始地址相关联”。它与整个数组相关联。

    不幸的是,这个问题变得更加令人困惑,因为 C++ 和 C 允许将数组隐式转换为指针。也就是说,以下是有效的:

    char* x = str;
    

    这被称为“指针衰减”,它在 C++ 中一直发生。直接盯着数组转成指针就够了。

    这个指针衰减等价于:

    char* y = &str[0];
    

    也就是说,当一个数组衰减到一个指针时,该指针指向数组的第一个元素。这可能意味着“将起始地址与 str 关联”,但正如我在上面解释的那样,这并不正确。 (此外,数组的起始地址通常在其第一个元素的地址之前之前,因为数组还需要存储它的大小,并且该大小通常在第一个元素之前立即放入内存中数组;但不能依赖此行为,它是一个实现细节。)

    【讨论】:

    • 如果"Hello" 语句实际上构造了一个包含"Hello world" 的数组,我会感到惊讶;)
    • @Space:我假设的 C+=2 编译器可以!它只是推断出你正在编写一个“hello world”程序……
    【解决方案3】:

    str可以看成是指向数组第一个元素地址的指针,也就是&str[0]。

    【讨论】:

      【解决方案4】:

      首先,“数组的名称总是翻译成它的起始地址。”这句话并不是 100% 正确的。
      数组的名称翻译成它的起始地址,即它的第一个元素的地址,除了两种情况

      1. 用作sizeof运算符的操作数时。
      2. 当它用作address of i.e. & 运算符的操作数时。

      例如:

      char str[10]="Happy";
      std::cout<<sizeof(str); // prints 10 as size of whole array is 10 bytes
      std::cout<<&str; // address of array of 10 char, not address of address of char  
      

      在所有其他情况下,数组名称转换为指向第一个元素的指针。所以对于前:

      char str[10]="Happy";
      std::cout<<str; // same as &str[0]. Let it prints 0x1000
      std::cout<<str+1; // same as &str[0]+1, will print 0x1001
      std::cout<<&str; // Let it prints 0x1000
      std::cout<<&str+1 // will print 0x100A
      

      【讨论】:

      • 在其他情况下,数组不会衰减为指针,例如,当通过引用传递给函数时:void foo( char (&amp;a)[10] ) 会很乐意接受问题中的数组:数组.
      【解决方案5】:

      表示str,单独来看,is of可以转换为char*类型(指向字符的指针),所以它实际上包含了字符数组的内存起始地址。

      【讨论】:

      • 不,str 的类型是 char[10],但在许多情况下它可以隐式转换为 char*
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-02
      • 1970-01-01
      相关资源
      最近更新 更多