| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> C语言 浅谈数组 -> 正文阅读 |
|
[C++知识库]C语言 浅谈数组 |
前言:博主初学c语言,水平有限,文章若有错误,望指正。 目录 在写代码时,假设要创建10个变量,你会怎么做?你可以直接 int a,b,c,d,......创建10个变量出来。但这样写是不是太麻烦了,我们有没有更简便的创建方式?当然是有的,这种方式就涉及到我们接下来要讲的数组了。 数组是什么?我们可以认为数组是一系列相同元素的集合。这个集合可以是一维的,二维的等等...我们这次主要讲的是一维数组与二维数组。 1.一维数组的创建与初始化1.1一维数组的创建
type_t :数组类型。 arr_name :数组名 const_n:常量表达式,通常是指数组的个数(有时我们也叫做数组长度),所以我们不能用n(一个变量)来定义一个数组。这里说一个我经常遇到的问题,我们在使用vs编译器时是不能用变量创建数组的。 再来举例说明如何创建数组,比如我要创建一个有十个元素的数组。
这样数组就创建出来了,但是只创建数组是一个不好的编程习惯,这样创建的数组缺少可控性。通常我们在创建数组后会对数组进行初始化。 1.2一维数组的初始化?而初始化就是在创建数组的同时对数组合理地赋初值。我们可以这样赋值
对整形数组赋值时我们通常把要赋的值以逗号间隔,放进大括号中。如果是对字符串数组赋值,我们也可以引用双引号创建数组(如arr2)。arr4的创建方式是不完全初始化,对一个数组进行不完全初始化时,其余数组元素均为0。我们也可以不写数组长度,像arr5 的创建方式,arr5的长度为3,你放几个数,数组就多长。 但是我们初始化的arr2,arr3和arr6 有区别吗? 用strlen求出各自的长度,结果arr6输出的值有误,打印每个数组,又是arr6 打印结果有误。 这又是为什么?由于如果我们在arr的[]中什么都不放,以'h', 'e', 'h', 'e'的形式初始化arr6,数组长度为4。'0'在数组中没空间存储,而我们知道 '\0'是字符串的结束标志,'\0'与'0' 的意义又是相同的,所以arr6 的字符串没有结束标志,程序不知道它的结束标志在哪,所以会出现随机值。这是c语言中常见的错误,在写代码的过程中要注意。 1.3一维数组的使用对数组初始化后,我们要怎么来使用呢?比如有一个数组,要怎么打印数组里的元素?我们可以通过 ' [ ] ' 下标访问操作符来访问数组元素。这里要注意的是,数组的下标总是从0开始。
我们通过下标访问操作符 ' [ ] ' 以及循环打印了数组的每个元素。 又一个问题,如果数组元素很多,我们要怎么求数组长度?总不可能一个个数吧。
这里我们用sizeof操作符,sizeof(arr)算出整个数组大小,sizeof(arr[0])是第一个元素大小,用总量除以一个元素的大小就能算出整个数组的元素个数。? 1.4一维数组的存储先打印数组中每个元素的地址,观察它们有什么规律
可以看到,通过下标的增长,元素的地址也在不断地增长,由于数组元素的地址是连续存放的,我们要找到其他元素的地址只需要知道第一个元素的地址,因此我们能通过指针来访问数组。
注意:这里的p + i并不是将首元素地址+i,而是将地址跳过i 个元素(假设p 为首元素地址),而我们创建一个整形数组,p + 1?表示的是下标为1?的数组元素地址,这个1?是跳过1个整形后的地址,地址将会加上两个整形的大小,也就是4。 2.二维数组的创建和初始化2.1二维数组的创建和一维数组类似,二维数组只是多加了个[ ],比如创建一个3行4列的二维整形数组。
2.2二维数组的初始化当然,和一维数组一样,我们要养成编程好习惯,在创建数组时随便把数组初始化。不过要注意的是?:二维数组的数组长度不能全部省略,我们可以省略行,但是不能省略列的个数。
原理很简单,既然是二维数组,那就要有行和列。我们知道数组第二行的开头是接在第一行的最后一个元素后面,可我连第一行在哪结束都不知道,那程序要怎么给数组赋值??所以我们是不能省略二维数组的列数的。当我们省略行数时,程序会根据列数确定一行中有多少个元素,所以,我们在创建二维数组时,列数一定不能省略。 跟一维数组不同,我们在对二维数组赋值的时候是可以在具体的行中赋值(当然,赋是值的数量不能超过一行的列数)。比如,我们创建一个三行三列的二维数组,把1,2放在第一行,3,4放在第二行,5,6放在第三行,我们可以这样赋值。
2.3二维数组的使用和一维数组一样,我们也是通过下标访问的方式来使用数组内的元素。例如要打印一个二维数组,我们通常是用循环嵌套的方式打印。
打印结果? ? ?2.4二维数组在内存中的存储哈哈相信你已经知道结论,没错,和一维数组一样,二维数组中的每个元素的地址都是按从高到低连续存放的。我们也打印二维数组中每个元素的地址。
? 结论和一维数组相同。? 3.数组越界在数组中下标规定都是从0开始的,也就是说最后一个元素的下标是n - 1。下标小于0或下标大于n - 1时,下标超出规定的合法范围,使用这样的下标就是越界访问。但是编译器在检查错误时不会对越界访问报错,所以在写代码时我们要注意自己的代码有没有越界访问的行为,从而减少产生不可预知的错误。 同样,二维数组也会有越界的情况,这里不再赘述? ?4.数组作为函数参数4.1数组名是什么?首先思考一个问题,数组名是什么?打印数组名的地址,会打印出整个数组的地址吗?
会打印出什么呢??可以看到数组名的地址和数组首元素地址相同,对数组名解引用,打印出的是数组首元素。可以得出结论,数组名就是数组首元素的地址。 但是有两个特例:1.sizeof(数组名)计算的是整个数组的大小,数组名代表整个数组。 2.&数组名,取出的是整个数组的地址。两种情况下,数组名表示的都是整个数组。 ? 通过刚刚的讲解,我们知道数组名代表的是首元素的地址,对数组名arr 加1 ,地址增加4(一个整形的大小),而对&arr 加1 ,地址增加20,跳过5个整形,而我们创建的数组长度是5,所以&arr + 1 跳过的是整个数组,&arr代表的是整个数组的地址。这样我们就能直观的理解这两种特殊情况了。 4.2数组名作为函数参数?我们知道在大多数情况下,数组名都代表数组首元素地址。那我们能不能在函数中计算数组的长度呢?用一个数组传参给函数,计算该数组的长度。 通过调试,sz的值不是我们想要的3。这是因为数组名代表数组首元素的地址,数组传参时只传了一个地址(这里int arr[]本质上表示的是一个指针,我们也能写成int* p,但是int arr[]更好理解),所以sizeof(arr)算出的是4(一个整形的大小)。那要计算数组长度时应该怎么做?我们可以在主函数就计算出数组长度,再把数组长度作为实参传给函数。? 这里挖个坑,过几天我会整理用函数编写冒泡排序的思路,到时用这个例子再讲一次计算数组长度的正确写法。 还没复习高数的我对明天的高数期中考瑟瑟发抖... 如果觉得博主写的不错,动动小手,点赞支持一下呗。 ? ? ? ? ? ? ? |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 5:59:41- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |