我已经测试了两个不同类似代码的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数组?这主要原因是什么?我非常好奇,请有人解释一下吗?
答案 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*
的指针将打印为字符串。