C++篇:第四章_数组_知识点大全
C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器
四、数组
(一)数组标准
-
以数组名作函数参数时,实参数组与形参数组都不必定义长度(即数组名可以做实参或形参),因此实参与形参的结合方式是地址结合,与数组长度无关对于一维数组是正确的,但对于一维以上是错误的(二维数组声明为形参的时候,必须要保留第二维的大小,当使用指针的时候,需要用数组指针)
-
不能用字符串常量对字符数组名进行整体赋值操作,因为数组名是常量任何时候都不能赋值,同样数组名之间是不能彼此赋值的
-
定义数组,中括号内必须是常量表达式(常量表达式是指值不会改变且在编译过程中就能够得到计算结果的表达式,能在编译时求值的表达式(例如const声明的)),常量表达式的值必须为正整数且大于等于1
-
引用数组元素时,数组下标可以是表达式、变量、常量,但必须都为正整数
-
在C++中,虽然数组名是一个指向数组首地址的指针,但是,数组名是一个常量指针,所以不能对数组名直接进行++操作。可以重新定义指针,指向数组首地址,对其进行++操作
-
二维数组是按行优先存储的
-
不允许使用引用数组
-
数组不是数据的集合,因为:
① 数组的长度不可变,集合的长度可变
② 数组存储的是同一个类型的数据,集合可以存储不同类型的数据
③ 数组既可以存储基本数据类型,也可以存储引用类型。集合只能存储引用类型
-
不能一次引用整个数组中的全部元素值
-
对于字符数组可以一次性输出整个数组中的字符(cout<<数组名;),但是对于数值类型的数组,只能利用循环进行逐个输出了
(二)数组使用
-
在函数体内定义动态数组(例:int A[10](后面没赋初值)),其元素没有初始化,为一个随机值
-
char a[]="xyz"//对的,字符数组初始化值,可以用双引号括起的字符串实现,但使用双引号字符串初始化数组时,字符个数必须比所定义的数组元素个数小1个
3. 基本类型数组的默认值
① byte[],short[],int[] ,默认值为0
② long[],默认值是0L
③ bool[]默认值为0
④ float[],double[],默认值为0.0
⑤ char数组默认值是‘‘
⑥ 对象类型数组:默认值为null
-
在C++中,auto* arr = new int[2]{ 1, 2 };//该定义数组的方式在C++11之后正确,但若用new分配数组空间时不能指定初值例:new int[2]->该定义在C++11前
-
int[] arr = { 1, 2 };//不正确,因为这是c#的语法,不是c++的
-
char s[5]={"abc"}等价于char s[5]=
-
如果想使一个数组中全部元素的值为0,可以写成int a[10]={0*10};
-
char a[] = {0, 1, 2, 3, 4, 5};//正确赋值
-
一个字符数组的话'\0'并不是必须的,但用赋初值方式来定义字符串,其中,'\0'是必须的;例:char str1[] = {'s', 't', 'r', '1', '\0'};
-
int m []={1,2,3,4,5,6,7,8,9,0};
int(p)[4]=(int()[4])m; // p是行指针,(int()[4])是格式类型转换,目的是为了把一维数组m强行转化成二维数组。因为这个二维数组的第二维大小为4,但是你的m中的元素个数为10,那么你的一维大小为10/4+1=3,即int (p)[4] 相当于int p[3][4]={{1,2,3,4},{5,6,7,8},{9,0}} -
数组作为函数的参数,传递的是数组的地址,由于形参数组就是实参数组,所以函数调用时不会为形参数组分配存储空间
-
多维数组作为函数的参数,形参数组第1维可以与实参相同,也可以不同;可以是任意长度,也可以不写长度;但其他维的长度需要相同
-
int t[3][2];可以用t[2]正确表示某个数组元素地址的表达式 // t[2]相当于&t[2][0]
-
字符数组只有在初始化时才能使用“=“...””这种整体赋值形式,初始化完成后就不能这么使用了
15. 数组的下标表示法处理速度与指针表示法处理速度比较(谭书P165页写着指针表示法比下标法快):
① 指针的访问速度比数组下标的快的情况:就是使用++运算
for (int i=0;i<size;i++) *(p++)=i; (1)
for(int i=0;i<size;i++) p[i]=i; (2)
对于指针访问速度快,主要是因为很多的机器指令中实现了++运算,他可以使用一个指令周期就完成,
对于数组的下标访问,他需要先获得数组的起始地址,计算偏移量,找到真正的访问地址
② 数组要比指针快的情况:
定义数组a[size] ,*p=a.假如要访问 a[i]
-
通过 a 访问
系统只需要计算常量 a 与 i*sizeof(type) 之和,然后访问该地址
-
通过 p 访问
P+是个变量,系统必须先访问 p 的地址,得到 p 的值,然后计算该值 v(p) 与 i*sizeof(type) 之和, 然后再访问得到的地址。
相比之下,(II) 要稍微慢一些(指针慢)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示