2011-10-07 71 views
0

我已经测试的与之相似代码的两个不同varianat不同类型的阵列,假设我有字符数组不同的行为与

char x[]="snow comes in winter "; 

然后下面的代码

#include <iostream> 
#include <string.h> 
using namespace std; 
int main(){ 

char x[]="snow comes in winter "; 
int k=0; 
int n=3; 
cout<<x+n-k+1<<endl; 
    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

打印"comes in winter " 而以下

#include <iostream> 
#include <string.h> 
using namespace std; 
int main(){ 

//char x[]="snow comes in winter "; 
int a[]={12,3,2,4,5,6,7}; 
int k=0; 
int n=3; 
cout<<a+n-k+1<<endl; 



return 0; 
} 

打印0xbffd293c 如果我们改变了一点

#include <iostream> 
#include <string.h> 
using namespace std; 
int main(){ 

//char x[]="snow comes in winter "; 
int a[]={12,3,2,4,5,6,7}; 
int k=0; 
int n=3; 
cout<<*(a+n-k+1)<<endl; 



return 0; 
} 

打印数量5. 所以我的问题是,为什么我们可以在字符数组的情况下访问这么容易?什么是它的主要原因是什么?我很curiousy并请可能有人请解释一下?

+0

你能澄清你的问题吗? – Griwes

+0

ok为什么它显示出不同类型的数组的不同结果?(在这种情况下,给出了char和integer数组) –

回答

9

为什么我们可以轻松访问char数组的情况?

因为有一个约定,C字符串表示为char*,所以人们认为char*实际上是字符串。 iostream跟着那个和char*的过载输出来打印字符串,而int*(在你的第二个例子中),它们打印地址的表示。

顺便说一句,有一个类似的输入过载,这是最不幸的,因为你不能控制,以防止缓冲区溢出。即。不这样做:

char x[10]; 
std::cin >> x; 
+2

您可以在'iostream'(或者更准确地说,在'ostream')中查看它,无论哪种C++您正在使用的标准库,并验证这是否适用于您自己。 – jelford

2

这种情况的原因回到C.

在C,char*被通常用于表示一个NUL终止的字符串(而不是一个指向个别char )。因此,采用char*的函数通常将参数视为字符串。在这种情况下,函数是operator<<,它所做的是将参数作为字符串输出。

对于int*没有这样的事情可以说,这就是指向int的指针。这里,operator<<输出指针的值(即地址)。只有当你明确地解引用指针指向的值时才会打印。

1

cout的左移运算符被重载以处理字符指针。意思是,当你给它一个指向字符的指针时,它会为你提供指针的引用,因此你会得到指向的数据。这在int的情况下不会发生,因为没有重载,所以您必须自己对指针取消引用。

1

鉴于Foo*类型的变量foo,表达式foo+nFoo*型的(假设n是一个组成型)。

打印指针的默认std::ostream机制是打印指针。有一个特别针对const char*指针的覆盖,它是打印由该指针指向的(可能是)以空字符结尾的字符串。

底线:不是char*的指针将被打印为指针。指针char*将作为字符串打印。