繁体   English   中英

C ++ - char数组和空字符

[英]C++ - char array and the null character

我有两个关于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打印hisomething here 我以为它应该打印出来

     hi something here 

    有3个witespaces。

    但如果我这样做:

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

    打印出3个空格。

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

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

至于你的主张,那个for(int i=0;i<5;i++){ cout << arr[i]; } 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

和hexdumped:

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

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

  1. arr本身是一个“char [5]”而不是“const char(*)[5]”。 当你写cin >> arr时,它会隐式地转换为“char *”rvalue。 它不是一个常数,因为它甚至不是一个左值。

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

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

数组只是一个数组:

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

但是数组很难成为操作数。 只有运算符我记得接受数组类型是sizeof和&(地址)(另一方面,这意味着有时必须是一个数组。否则如果你写sizeof(a),它会给你大小一个指针。) 对于其他操作,a转换为char * rvalue。 是的,即使你写一个[0],一个[1]等,a [0]相当于*(a + 0),它对指针进行操作但不对数组进行操作。

当你无法分配某些东西时,它并不总是意味着东西是“const”:

  1. 当然不能分配给const变量。
  2. 您只能分配给变量(或称为左值),因此您无法为rvalue(或aka值)分配内容。 所以你不能写1 = 2,因为1是rvalue而不是变量,不是因为1是“const”。
  3. 您必须将某些内容分配给与其类型匹配的变量。 所以如果你有一个const char * p和一个char * q,你就不能写q = p。 他们的类型不匹配。 而且,它并不意味着q是常数,因为它显然不是。 但是你可以编写p = q,因为char *可以隐式地转换为const char *。 但是const char *必须明确地转换为char *。

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

例:

arr=&another_variable; //Illegal
*arr='A';              //Legal
  1. 第一个不是常数。 第二,这段代码不安全。
  2. 你应该在最后设置终止符号'\\ 0'。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM