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

Different behavior with different types of arrays

本文关键字:数组 同类型      更新时间:2023-10-16

我已经测试了两个类似代码的不同变体,假设我有字符数组

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数组?主要原因是什么?我很好奇,有人能解释一下吗?

为什么我们可以访问在char数组的情况下这么容易?

因为习惯上C字符串用char*表示,所以人们认为char*实际上是字符串。iostream紧跟其后,并重载char*的输出以打印字符串,而对于int*(在第二个示例中),它们打印地址的表示形式。

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

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

原因可以追溯到c。

在C语言中,char*通常用于表示以null结尾的字符串(与指向单个char的指针相反)。因此,采用char*的函数通常将实参视为字符串。在本例中,函数是operator<<,它所做的是将实参作为字符串输出。

对于int*就不能这样说了,它只是一个指向int的指针。这里,operator<<打印出指针的值(即地址)。只有在显式解引用指针时,才会输出指向的值。

cout的左移操作符被重载以处理char指针。意思是,当你给它一个指向字符的指针时,它会为你解除对指针的引用,这样你就得到了指向的数据。这在int类型的情况下不会发生,因为没有重载,所以你必须自己解除对指针的引用。

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

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

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