3

我有两个关于 char 数组的问题。

  1. 从下面的代码中,既然arrconst,为什么编译器不给我一个错误,因为我正在重写它?

    char arr[5]; // arr is a const pointer to (*)[5] array
    cin>>arr; //   
    
  2. 当我像这样初始化一个 char 数组时:

    char arr[5]={'h','i'};
    

    如果我这样做:

    cout << arr << "something here \n"; 
    

    它会打印hisomething here。我以为它应该打印出来

    hi   something here
    

    有 3 个空位。

    但如果我这样做:

    for(int i = 0; i < 5; i++){
      cout << arr[i];
    }
    

    它将打印出 3 个空格。

第二种情况似乎证明编译器没有添加任何空字符。那么编译器如何忽略这 3 个空格呢?

4

4 回答 4

8
  1. 这个数组不是const,因为没有const限定符。
  2. 如果您没有在初始化列表中指定剩余值,它们将被初始化为0. 0用于终止 C 字符串,而不是作为空格。

至于你的说法,那个for(int i=0;i<5;i++){ cout << arr[i]; }打印的空白 - 你是怎么检查的?

为了我:

#include <iostream>

int main(){
    char arr[5]={'h','i'};
    for(int i=0;i<5;i++){ std::cout << arr[i]; }
    std::cout << "X" << std::endl;
}

印刷:

hiX

和十六进制转储:

$ ./t | hexdump -Cv
00000000  68 69 00 00 00 58 0a                              |hi...X.|
00000007

'\0'打印的字符。它们的显示似乎取决于操作系统。但它们不是空格。

于 2012-04-21T08:19:35.863 回答
3
  1. arr 本身是“char[5]”而不是“const char (*)[5]”。当您编写 cin >> arr 时,它会隐式转换为“char *”右值。它不是 const,因为它甚至不是左值。

而“const char *”或“char const *”表示指向的左值不能改变,而“char * const”表示指针的左值本身不能改变。但这与您的问题无关。

  1. 首先,没有空格。它是 cin 附加的空字符。

数组只是一个数组:

char a[5]; //a's type is char[5];

但是数组几乎不可能是操作数。只有运算符我记得接受数组类型是 sizeof 和 &(address-of) (另一方面,这意味着有时 a 必须是一个数组。否则如果你写 sizeof(a),它会给你大小的指针。)。对于其他操作 a 被转换为 char * rvalue。是的,即使你写了 a[0]、a[1] 等。a[0] 等价于 *(a + 0),它对指针而不是数组进行操作。

当你不能分配给某个东西时,它并不总是意味着那个东西是“const”:

  1. 当然,您不能分配给 const 变量。
  2. 您只能分配给变量(或又称左值),因此您不能将某些内容分配给右值(或又称值)。所以你不能写 1 = 2,因为 1 是一个右值而不是一个变量,而不是因为 1 是“const”。
  3. 您必须将某些内容分配给与其类型匹配的变量。所以如果你有一个 const char *p 和一个 char *q,你不能写 q = p。他们的类型不匹配。再说一次,这并不意味着 q 是 const,因为它显然不是。但是你可以写 p = q,因为 char * 可以隐式转换为 const char *。但是 const char * 必须明确地转换为 char * 。
于 2012-04-21T08:26:54.570 回答
0
  1. 第一个它不是常量。第二,这段代码不安全。
  2. 你应该在最后设置终止符号'\0'。

您不应该使用 char 类型,请尝试使用字符串而不是 char 数组。

于 2012-04-21T09:33:22.937 回答
0

arr 充当 const 指针,这意味着您不能将指针设置为另一个地址。它不是指向 const 的指针,因此您可以更改指针指向的地址处的数据。

例子:

arr=&another_variable; //Illegal
*arr='A';              //Legal
于 2012-04-21T08:24:19.617 回答