我有两个关于char数组的问题。
开始,因为arr
是const
,为什么编译器没有给我一个错误,因为我正在重写它?
char arr[5]; // arr is a const pointer to (*)[5] array
cin>>arr; //
当我初始化这样的char数组时:
char arr[5]={'h','i'};
如果我这样做了:
cout << arr << "something here \n";
它会打印hisomething here
。我以为它应该打印出来
hi something here
有3个witespaces。
但如果我这样做了:
for(int i = 0; i < 5; i++){
cout << arr[i];
}
将打印出3个空格。
第二种情况似乎证明编译器不会添加任何空字符。那么编译器如何忽略3个空格呢?
答案 0 :(得分:8)
const
,因为没有const
限定符。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
和hexdumped:
$ ./t | hexdump -Cv
00000000 68 69 00 00 00 58 0a |hi...X.|
00000007
打印了'\0'
个字符。它们的显示似乎取决于操作系统。但它们不是空白。
答案 1 :(得分:3)
并且“const char *”或“char const *”表示指向的左值不能更改,而“char * const”表示指针左值本身不能更改。但这与你的问题无关。
数组只是一个数组:
char a[5]; //a's type is char[5];
但是数组很难成为操作数。只有我记得接受数组类型的运算符是sizeof和&amp;(address-of)(另一方面,这意味着有时必须是一个数组。否则如果你写sizeof(a),它会给你指针的大小。对于其他操作,a转换为char * rvalue。是的,即使你写一个[0],一个[1]等等,a [0]相当于*(a + 0),它对指针进行操作但不对数组进行操作。
当你无法分配某些东西时,并不总是意味着东西是“const”:
答案 2 :(得分:0)
arr表示const指针,这意味着您无法将指针设置为另一个地址。它不是指向const的指针,因此您可以更改指针指向的地址处的数据。
示例:
arr=&another_variable; //Illegal
*arr='A'; //Legal
答案 3 :(得分:0)
你不应该使用char类型,尝试使用string而不是char数组。