C ++ - 数组的名称和起始地址

时间:2011-01-20 09:08:36

标签: c++ string char

在第(7)章的 C ++ Without Fear:让你感觉聪明的初学者指南中,它提到了以下内容:

char str[10] = "Hello!";

此声明创建显示的数组,并关联 起始地址 使用str 。 (请记住,数组的名称总是转换为它的开头 地址)。

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

感谢。

5 个答案:

答案 0 :(得分:4)

这意味着'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    |

答案 1 :(得分:3)

  

这是什么意思?

     

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

相关联

这意味着

  1. 数组在内存中构建并填充"Hello!"的内容(即字符'H''e''l''l''o''!''\0'
  2. 创建指针变量str并指向之前创建的数组的起始地址。
  3. 然而,这是错误的。书中的描述是错误的,或至少是严重误导。

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

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

    char* x = str;
    

    这称为“指针衰减”,它一直在C ++中发生。只需尖锐地盯着一个数组就可以将它转换为指针。

    此指针衰减等效于以下内容:

    char* y = &str[0];
    

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

答案 2 :(得分:2)

str可以被视为指向数组第一个元素地址的指针,即& str [0]。

答案 3 :(得分:2)

首先,声明“数组的名称始终转换为其起始地址。”,并非100%正确。
数组的名称转换为它的起始地址,即第一个元素的地址,除了两种情况

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

    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
    

答案 4 :(得分:0)

这意味着str,单独使用,可以转换为类型char*(指向字符的指针),所以它实际上包含了内存起始地址字符数组。