不同类型的数组的不同行为

时间:2011-10-07 13:46:26

标签: c++ arrays printing

我已经测试了两个不同类似代码的varianat,假设我有char数组

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号。 所以我的问题是为什么我们可以很容易地访问char数组?这主要原因是什么?我非常好奇,请​​有人解释一下吗?

4 个答案:

答案 0 :(得分:9)

  

为什么我们可以很容易地访问char数组?

因为有一个约定,C字符串由char*表示,人们认为char*实际上是字符串。 iostream跟随char*以及int*的重载输出来打印字符串,而对于char x[10]; std::cin >> x; (在第二个示例中),它们会打印地址的表示。

BTW输入有类似的重载,这是最不幸的,因为你无法控制它以防止缓冲区溢出。即。不要这样做:

{{1}}

答案 1 :(得分:2)

原因可以追溯到C.

在C中,char*通常用于表示以NUL结尾的字符串(而不是指向单个char的指针)。因此,采用char*的函数通常将参数视为字符串。在这种情况下,函数是operator<<,它的作用是将参数打印为字符串。

int*没有这样的说法,就是那个指向int的指针。这里,operator<<打印出指针的值(即地址)。只有在您明确取消引用指针时才会打印指向的值。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

给定foo类型的变量Foo*,表达式foo+n也是Foo*类型(假设n是整数类型)。

打印指针的默认std::ostream机制是打印指针。有一个专门用于const char*指针的覆盖,用于打印由该指针指向的(可能)空终止字符串。

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