注:声明、定义和初始化概念之间的区别见另外的博客
文章目录
一、数组的分类
1、数组按照维度划分:
分为(1)一维数组 (2)二维数组 (3)多维数组
注意:(1)各种类型的数组 的 定义方法 不完全相同,有的有好几种定义方法
(2)初始化的方法是有共同规律的
2、一维数组(最常见)
3、二维数组(也很常见)
4、三维数组,看一个考题迅速学习
牛客网6.在定义 int a[3][4][2]; 后,第 20 个元素是( )
a[2][1][1]
a[1][0][1]
a[2][0][1]
a[2][2][1]
正确答案: A 你的答案: D (错误)
经典解析:
三维数组可以看成是一本书!
int a[3][4][2]; 就是有3页每页4行2列
a[2][1][1] 就表示第3页第2行第2列 8+8+4=20
二、数组的三种定义方式(下面是一维数组的)
参考链接:https://blog.youkuaiyun.com/luChenH/article/details/78893965
1.数组的定义
用于存储同一类型数据的集合,其实数组就是一个容器。
连续的存储单元
2.数组的好处
自动给数组中的元素从零开始编号。自动给下标,从零开始0-1-2-3-……
3.书写格式
元素类型[] 数组名 = new 元素类型[]{元素,元素,元素……};
方式1: int [] arr = new int[5];
需要手动赋值
arr[0]=1;
arr[1]=2;
arr[3]=3
arr[4]=4;
arr[5]=5;
方式2: int [] arr = new int[]{1,3,5,7}
方式3: int[]arr = {1,3,5,7};
// 错误的写法
int [] i = [1,2,3,4];
总之,具体的元素不能被[ ]包裹。[ ]包裹的应该是数组的数量。
三、数组的初始化方式——数组的三种初始化方式
参考:
01:https://blog.youkuaiyun.com/qq_41992047/article/details/82842880
02:https://www.cnblogs.com/sunyubin/p/9720634.html
注意初始化定义:变量初始化:在定义的同时赋值;(注意,定义之后,再去赋值不叫初始化)
1.静态初始化
静态初始化:在定义数字的同时就为数组元素分配空间并赋值;
除了用new关键字来产生数组以外,还可以直接在定义数组的同时就为数组元素分配空间并赋值。
例 int[] a={1,2,3};//静态初始化基本类型数组
Man[] mans={new Man(1,1),new Man(2,2)};//静态初始化引用类型数组
2.动态初始化
动态初始化:数组定义与为数组分配空间和赋值的操作分开进行;
int[] a1=new int[2];//动态初始化元素,先分配空间
a1[0]=1;//给数组元素赋值
a1[2]=2;
3.数组的默认初始化
默认初始化:数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐式初始化。见下图所示。
实例:int a2[]=new int[2];//默认值0,0
boolean[] b=new boolean[2];//默认值 false,false
String[] s=new String[2];//默认值null
四、字符数组的初始化方式(两种方法)
1、字符数组初始化有2种方法 (1)不指定长度,即默认元素个数 (2)指定元素个数
//大{}号法 初始化列表
char buf1[] = {‘a’, ‘b’, ‘c’, ‘d’, ‘e’}; //若没有指定长度,默认不分配零
//若指定长度,不够报错;buf长度多于初始化个数,会自动补充零,这个零不是以’\0’ 。
char buf2[6] = {‘a’, ‘b’, ‘c’, ‘d’, ‘e’};
char buf3[6] = {‘a’, ‘b’, ‘c’, ‘d’, ‘e’};
2、四种常见的写法:
用字符串来初始化数组 不指定长度
char buf2[] = {‘a’, ‘b’,‘c’,‘d’,’\0’};
字符串常量初始化一个字符数组
char buf3[] = {“abcde”}; //结论:会补充零
char buf4[] = “abcde”;
char buf5[100] = “abcde”;
//在C语言中使用字符数组来模拟字符串
//C语言中的字符串是以’\0’结束的字符数组
//C语言中的字符串可以分配于栈空间,堆空间或者只读存储区
int main12()
{
//方法1 用字符串来初始化数组 不指定长度,
char buf2[] = {'a', 'b','c','d','\0'};
//方法2 字符串常量初始化一个字符数组
char buf3[] = {"abcde"}; //结论:会补充零
char buf4[] = "abcde";
char buf5[100] = "abcde";
printf(" strlen(buf5) :%d \n", strlen(buf5));
printf(" sizeof(buf4) :%d \n", sizeof(buf5));
printf(" sizeof(buf4) :%d \n", sizeof(buf4));
}
牛客网的考题:
char a[] = "OK";
char *a = "OK";
char a[10];a = "OK"; //报错,等式左边必须是可以修改的左值,而数组名指向的地址是不能被修改的,不然没办法析构
char a[10] = "OK";
char *a; a = "OK";
char str[] = "hello";
char str[100] = "hello";
char str[] = { 'h','e','l','l','o' };
char str[] = { 'hello' };//会报错,单引号里面是单个字符 双引号引字符串
2、错误格式(自己犯过的错)
(1)正确的写法
char buf5[100] = “abcde”;
buf5[1] = {‘f’};
cout << “buf5=”<< buf5<<endl;
错误的写法1:
char buf5[100] ;
buf5[100] = "abcde"; //报错,这个是赋值操作,不叫初始化
cout << "buf5="<< buf5<<endl;
错误: 不能将 "const char *" 类型的值分配到 "char" 类型的实体
错误原因:buf5[100] 是没有的,只有buf[99]
错误的写法2:
char buf5[100] ;
buf5 = "abcde"; //报错,这个是赋值操作,不叫初始化
cout << "buf5="<< buf5<<endl;
报错:表达式必须是可修改的左值
错误原因:buf5是数组名,是一个一级指针,数组名是不可以改变的,要不然无法析构数组资源,所以这里提示表达式必须是可修改的左值 。这种写法根本就是错的。
五、字符型指针指向字符串
char * buf5 = "abcde";
cout << "*buf5="<< buf5<<endl;