第6章 数组第2篇——(1)数组的分类(2)数组的定义方式(3)数组的初始化方式(4)字符串数组的初始化方式

注:声明、定义和初始化概念之间的区别见另外的博客

一、数组的分类

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;

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值