不同类型的数组有不同的行为
Different behavior with different types of arrays
我已经测试了两个类似代码的不同变体,假设我有字符数组
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*
类型的指针将被打印为字符串
- 具有纯虚函数和指针数组对象类型的父类的指针数组
- 多维数组的类型、名称是什么?
- 共享_ptr中多功能数组的类型是什么
- 为什么 std::variant 不能容纳数组对象类型,而联合可以?
- 为什么数组(字符串类型)的大小是 24 字节,带有单个空格元素
- 数组的类型无效
- 以符合标准的方式用与数组相同类型的成员重新解释结构
- 从数组的类型中找到元素的类型
- 接受来自函数的二维数组(int 类型)并将其返回到主函数
- C++从字符数组返回类型为T的指针
- 为什么数组的类型推断会将指向第一个的指针优先于对数组的引用
- 函数指针数组的类型是什么
- 整数数组返回类型
- 如何在 c++ 中填充指针数组,类型 char
- int 数组的类型是什么
- 使用类型的参数包和相应值的输入数组构造类型
- 调用另一个函数的私有成员-数组和类型的问题
- 从数组的类型中获取数组的大小
- 为什么boost::fusion序列中的struct数组成员类型不能正确推导
- 指针数组和类型转换