2015-10-16 50 views
0

我有以下问题:字符数组VS int数组

int a[2][2]={{1,2},{3,4}}; 
cout<<a[1]; //the output is 0x29ff18 , which is an address 
-------------------------------------------------------------------- 
char b[][6]={"hello","there","now"}; 
cout<<b[1]; //the output is there, which is value of b[1] 

我很奇怪,为什么B [1]将不会给出[1] ...

感谢像一个地址!

+0

'a [1]'和'b [1]'是数组,不是地址。但这与你的表面问题无关。 –

+0

我不知道为什么结果会不同 – jackycflau

+0

表达式'b [1]'被隐式转换为'char *','char *'的流重载打印一个字符串,如果你想要的地址需要强制转换:'std :: cout << static_cast (b [1]);'。它在'a'的情况下打印地址,因为'int *'没有更好的重载。 – user657267

回答

-1

v的类型决定了什么c打印。

一种情况你有int数组,其他情况你有char数组。根据定义Cout打印一个不同于int数组的char数组。就是这样。正如bjorne。

1

在字符数组和一个整数阵列之间的基本区别是终止空字符:\0 如果你声明你的字符数组是这样的: char b[] = {'h','i'}; 然后你cout语句无法确定做什么,并给奇怪的输出。但只要你做:

char b[] = {'h','i','\0'}; 

char b[] = "hi"; 

cout工作正常。这是因为首先,在最后显式地添加一个空字符,而在第二个中,它由编译器自动添加。

而对于数组,数组声明为a[]a[][],编译器将存储在变量a数组的第一个元素的地址,让你在一个非字符数组的情况下获得的第一个元素的地址。 请参阅此链接了解更多信息: What is the difference between int and char arrays?

+0

谢谢!这意味着如果我定义了char a [2] = {'a','b'},那是不正确的?我应该使用[3] = {'a','b','\ 0'},而不是? – jackycflau

+0

@JackyLau是的!使用后一种方法,或者简单地使用[3] =“ab” –