大家好啊这里是土豆的博客一个正在努力学习技术的大学生。上一篇我们正式开始了数组这个知识点聊了数组是什么、为什么需要数组以及数组适合解决什么问题。如果说上一篇是认识数组那今天这篇我们就先讲讲这个数组的一些基础知识。因为很多同学刚开始学数组的时候真正把自己绕晕的地方往往不是定义数组也不是赋值而是下面这些问题数组为什么从 0 开始数组长度明明是 5为什么a[5]还会出问题下标到底表示第几个元素为什么有时候程序没报错但输出结果却奇奇怪怪所以今天这篇我们就专门聊聊数组里最容易踩坑的地方。好了废话不多说咱们直接开始。一、数组长度是 5到底是什么意思先来看最简单的数组int a[5];这句话表示数组a有5 个位置。我们把它画出来下标 0 1 2 3 4 内容 ? ? ? ? ?这里一定要注意。数组长度是 5。表示一共有 5 个元素分别是a[0] a[1] a[2] a[3] a[4]到这里刚好已经是 5 个位置了。所以a[5]其实是第 6 个位置这个位置根本不存在。所以访问它就是越界。二、为什么很多同学总喜欢从 1 开始因为生活习惯。比如第一名第二名第三名第四名第五名我们几乎不会说 第零名。所以很多同学看到int a[5];脑子里会自动变成a[1] a[2] a[3] a[4] a[5]感觉特别自然。我刚开始也是这么想的。结果一写程序就开始出问题。后来我发现一个比较容易接受的方法。不要把下标理解成第几个。而是理解成距离起点偏移了多少格。因为我们可以理解成0 代表没有移动。比如下标 0 1 2 3 4 元素 10 20 30 40 50a[0]表示从起点移动 0 格。所以拿到第一个元素。a[1]表示从起点移动 1 格。所以拿到第二个元素。三、数组越界为什么危险很多同学第一次写数组都会这样#include iostream using namespace std; int main() { int a[5] {1,2,3,4,5}; cout a[5]; return 0; }然后发现程序居然运行了。甚至还能输出一个数字。 这里恰恰是数组最危险的地方。因为a[5]访问的是数组外面的内存。而这块内存里可能刚好有一些数据。所以程序有时候会输出奇怪数字会崩溃会运行正常会偶尔出错四、最容易写错的其实是循环来看一个特别经典的错误。int a[5]; for(int i0;i5;i) { cin a[i]; }大家先暂停思考一下。这段代码有没有问题但实际上i 0 i 1 i 2 i 3 i 4 i 5循环执行了 6 次。最后一次a[5]直接越界。正确写法应该是for(int i0;i5;i) { cin a[i]; }注意这里i 5不要写i 5这个地方我觉得真的特别容易出现问题。尤其是考试紧张的时候。有时候代码看起来完全一样。结果就是那个等号让程序悄悄跑偏了。五、怎么快速判断会不会越界这里我分享一个我自己常用的方法。就是先写出数组长度再写出合法下标。比如int a[5];先别急着写代码。脑子里先想长度 5 合法下标 0 1 2 3 4那循环范围自然就是for(int i0;i5;i)因为i : 0 1 2 3 4正好对应数组下标。再比如int score[10];先想长度 10 合法下标 0 1 2 3 4 5 6 7 8 9循环就写for(int i0;i10;i)永远不要凭感觉。很多数组错误其实不是不会写。而是脑子里默认1 ~ 10结果代码里却是0 ~ 9少看一个数字或者多写一个数字程序就开始出问题。六、刚开始学数组不要急着记复杂规则说实话我刚开始学数组的时候也查过很多资料。有人讲内存连续。有人讲地址偏移。有人讲a[i] 等价于 *(ai)当时看得我头皮发麻。感觉一个数组而已怎么后面还连着这么多东西后来我发现。对于刚开始学 C 的同学来说。先记住下面三句话其实就够用了。第一句话数组长度是n合法下标0 ~ n-1第二句话数组下标表示移动多少格。a[0]表示移动 0 格。a[3]表示移动 3 格。所以它对应第四个元素。第三句话循环写数组时优先写for(int i0;in;i)看到最好停下来检查一下。问问自己会不会多循环一次七、总结数组本身就比普通变量复杂一点。因为它开始让我们同时关注数据有几个下标是多少循环范围是什么哪个位置正在被访问这些东西刚开始混在一起确实容易乱。我觉得这里最重要的一件事就是刚开始学习的时候多画图。比如int a[5]{1,2,3,4,5};画出来下标 0 1 2 3 4 元素 1 2 3 4 5然后再去看a[2]或者for(int i0;i5;i)一下子就清楚很多。刚开始学的时候慢一点没关系。别觉得画图浪费时间。很多题目画出来之后思路会顺畅很多。八、写在最后总之数组真正难住很多同学的地方并不是定义数组而是下标和越界。因为我们的生活习惯总喜欢从 1 开始数。但 C 数组偏偏从 0 开始。刚接触的时候看着确实有点别扭。不过不用一开始就把所有东西都理解得特别透。先记住长度是 n下标范围就是 0 到 n-1。写循环优先用i n。出现越界问题时先检查循环条件。慢慢写几道题之后你会发现数组其实没有想象中那么难。那这篇就先到这里。如果这篇文章对你有帮助麻烦点赞、关注和收藏吧谢谢有什么问题或者想法欢迎在评论区留言我们一起交流我们下篇见
C++ 入门学习经验 08——数组中:为什么数组长度是 5,却不能访问 a[5]?
大家好啊这里是土豆的博客一个正在努力学习技术的大学生。上一篇我们正式开始了数组这个知识点聊了数组是什么、为什么需要数组以及数组适合解决什么问题。如果说上一篇是认识数组那今天这篇我们就先讲讲这个数组的一些基础知识。因为很多同学刚开始学数组的时候真正把自己绕晕的地方往往不是定义数组也不是赋值而是下面这些问题数组为什么从 0 开始数组长度明明是 5为什么a[5]还会出问题下标到底表示第几个元素为什么有时候程序没报错但输出结果却奇奇怪怪所以今天这篇我们就专门聊聊数组里最容易踩坑的地方。好了废话不多说咱们直接开始。一、数组长度是 5到底是什么意思先来看最简单的数组int a[5];这句话表示数组a有5 个位置。我们把它画出来下标 0 1 2 3 4 内容 ? ? ? ? ?这里一定要注意。数组长度是 5。表示一共有 5 个元素分别是a[0] a[1] a[2] a[3] a[4]到这里刚好已经是 5 个位置了。所以a[5]其实是第 6 个位置这个位置根本不存在。所以访问它就是越界。二、为什么很多同学总喜欢从 1 开始因为生活习惯。比如第一名第二名第三名第四名第五名我们几乎不会说 第零名。所以很多同学看到int a[5];脑子里会自动变成a[1] a[2] a[3] a[4] a[5]感觉特别自然。我刚开始也是这么想的。结果一写程序就开始出问题。后来我发现一个比较容易接受的方法。不要把下标理解成第几个。而是理解成距离起点偏移了多少格。因为我们可以理解成0 代表没有移动。比如下标 0 1 2 3 4 元素 10 20 30 40 50a[0]表示从起点移动 0 格。所以拿到第一个元素。a[1]表示从起点移动 1 格。所以拿到第二个元素。三、数组越界为什么危险很多同学第一次写数组都会这样#include iostream using namespace std; int main() { int a[5] {1,2,3,4,5}; cout a[5]; return 0; }然后发现程序居然运行了。甚至还能输出一个数字。 这里恰恰是数组最危险的地方。因为a[5]访问的是数组外面的内存。而这块内存里可能刚好有一些数据。所以程序有时候会输出奇怪数字会崩溃会运行正常会偶尔出错四、最容易写错的其实是循环来看一个特别经典的错误。int a[5]; for(int i0;i5;i) { cin a[i]; }大家先暂停思考一下。这段代码有没有问题但实际上i 0 i 1 i 2 i 3 i 4 i 5循环执行了 6 次。最后一次a[5]直接越界。正确写法应该是for(int i0;i5;i) { cin a[i]; }注意这里i 5不要写i 5这个地方我觉得真的特别容易出现问题。尤其是考试紧张的时候。有时候代码看起来完全一样。结果就是那个等号让程序悄悄跑偏了。五、怎么快速判断会不会越界这里我分享一个我自己常用的方法。就是先写出数组长度再写出合法下标。比如int a[5];先别急着写代码。脑子里先想长度 5 合法下标 0 1 2 3 4那循环范围自然就是for(int i0;i5;i)因为i : 0 1 2 3 4正好对应数组下标。再比如int score[10];先想长度 10 合法下标 0 1 2 3 4 5 6 7 8 9循环就写for(int i0;i10;i)永远不要凭感觉。很多数组错误其实不是不会写。而是脑子里默认1 ~ 10结果代码里却是0 ~ 9少看一个数字或者多写一个数字程序就开始出问题。六、刚开始学数组不要急着记复杂规则说实话我刚开始学数组的时候也查过很多资料。有人讲内存连续。有人讲地址偏移。有人讲a[i] 等价于 *(ai)当时看得我头皮发麻。感觉一个数组而已怎么后面还连着这么多东西后来我发现。对于刚开始学 C 的同学来说。先记住下面三句话其实就够用了。第一句话数组长度是n合法下标0 ~ n-1第二句话数组下标表示移动多少格。a[0]表示移动 0 格。a[3]表示移动 3 格。所以它对应第四个元素。第三句话循环写数组时优先写for(int i0;in;i)看到最好停下来检查一下。问问自己会不会多循环一次七、总结数组本身就比普通变量复杂一点。因为它开始让我们同时关注数据有几个下标是多少循环范围是什么哪个位置正在被访问这些东西刚开始混在一起确实容易乱。我觉得这里最重要的一件事就是刚开始学习的时候多画图。比如int a[5]{1,2,3,4,5};画出来下标 0 1 2 3 4 元素 1 2 3 4 5然后再去看a[2]或者for(int i0;i5;i)一下子就清楚很多。刚开始学的时候慢一点没关系。别觉得画图浪费时间。很多题目画出来之后思路会顺畅很多。八、写在最后总之数组真正难住很多同学的地方并不是定义数组而是下标和越界。因为我们的生活习惯总喜欢从 1 开始数。但 C 数组偏偏从 0 开始。刚接触的时候看着确实有点别扭。不过不用一开始就把所有东西都理解得特别透。先记住长度是 n下标范围就是 0 到 n-1。写循环优先用i n。出现越界问题时先检查循环条件。慢慢写几道题之后你会发现数组其实没有想象中那么难。那这篇就先到这里。如果这篇文章对你有帮助麻烦点赞、关注和收藏吧谢谢有什么问题或者想法欢迎在评论区留言我们一起交流我们下篇见