C++数组的高级使用用法(下标可以为负数?)

C++数组:下标为负数的探索
本文探讨了C++数组的高级用法,包括从不同角度理解数组的本质,以及允许数组下标为负数的情况。通过示例代码,解释了数组元素的三种获取方式,并分析了下标为负数时可能引发的问题和潜在风险。

目录

准备:笔者对数组的理解

I 获取数组元素的值的三种用法

II 数组下标可以为负数?

END~~~


准备:笔者对数组的理解

如果说定义一个变量代表向内存中申请一块地址来保存这种类型的值,那么定义一个该变量类型的数组就是在内存中申请连续的多块地址来保存这种类型的值(连续:相当于把几个变量集合起来,相互挨着),所以说数组本质上可以算一个指针,指向一个整体

I 获取数组元素的值的三种用法

先来看一段代码:

Code1

#include<iostream>
using namespace std;
int test[10]={-231,899,8955,6445,545,121,7855,77,1,19};
int main(){
	cout<<test[3]<<endl;
	cout<<3[test]<<endl;
	cout<<*(test+3)<<endl;
	return 0;
}

1. ~~~数组名[下标值]

这是我们最常见的用法,不用多说。

2  ~~~(下标值)[数组名]

这个用法我们不常见,但在一些高级的书籍中会有介绍,读者只需知道它和第一种方式是等价的。

3  ~~~*(数组名+下标值)(重点)

这个用法就涉及到数组的本质。我们首先要知道被规定的一点:数组名是就是一个指针,它永远指向数组的第一个元素。既然数组申请的是一块连续的内存地址,那好办了,我们访问某个该数组的·元素就可以用该方式,让指针移动即可。

注意:

1.这里的相加,c++会自动判断变量类型,并对应加上相应的地址。

2.数组的下标是从零开始的,如果定义大小为10,那么下标范围为 0~9

3.第二种方式中下标值的小括号尽量不要省略,下文有实例说明

上图程序的运行结果如下图所示,结果一样,三种方式等价!

II 数组下标可以为负数?

 根据上述讨论,我们知道数组本质上是指针。那么如果我的下标是负数会怎么样,我们尝试一下:

Code2

#include<iostream>
using namespace std;
int test[10]={-231,899,8955,6445,545,121,7855,77,1,19};
int main(){
	cout<<test[-1]<<endl;
	cout<<(-1)[test]<<endl;
	cout<<-1[test]<<endl;
	cout<<*(test-1)<<endl;
	return 0;
}

程序运行结果如图所示:

 我们先解释为0的情况,-1就相当于以数组首元素内存地址为基准向前移动,而我们的数据都在首元素地址后面,指针自然而然指向了一个未知的领域,结果为0。这种情况编译器不会报错,但很危险,如果指针恰好指向了系统正在使用的内存区域,就会造成不可预测的后果。如下图所示:

 

那么为什么冒出来个-899,我们发现这其实是我们定义的数组元素的第二个值。那么就是语法问题了。编译器首先取出了 1[test],然后执行 - 的操作,但我们想要的是 -1 [test],我们只需加个()括住就没问题了,它的优先级比较高嘛。

注意:

1.数组大小不能为负数,如 int a[-2323]就会发生致命错误。

END~~~

本文作者想用通俗的语言让读者理解,如有错的地方欢迎评论。谢谢阅读,感谢支持!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

感谢有你陪伴

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值