数组定义及初始化

10 篇文章 0 订阅
10 篇文章 0 订阅


# 学习简介 主要学习数组的初始化和数组的常见操作等。

一、数组的概念

1.定义

数组(array)是一种数据格式,能够存储多个同类型的值。

2.声明数组

通用格式: TypeName ArrayName[ArraySize];
(1)TypeName :存储在数组中每个元素的值得类型,比如:int、 float 、double、char等。
(2)ArrayName :数组名。
(3)ArraySize :数组元素的个数。该值一定是在编译时就是已知确定的值。所以它必须是整型常数或者是const值、常量表达式,不能是编译时值不确定的变量。
注意:
if(ArrayIdx > ArraySize)
编译可正常编译,不报错;
运行结果为脏值;
这种情况的写法是非常危险的。

错误示例:
	int name[10];
	cout<<name[0]<<endl;
	cout<<name[20]<<endl; //在编译时,不会报错,所以这种数组越界访问是很危险,需要人为校验,或者添加代码校验,否则输出脏值。
	//以上代码在运行时,会发生提示:使用数组name,但没有对其进行初始化,输出的值都是脏值。
正确示例:
	int name[10]={0,1,2}; //这种初始化,默认后面的数值均为0
	cout<<name[0]<<endl; //0
	cout<<name[2]<<endl; //2
	cout<<name[8]<<endl; //0

二、数组初始化规则

1.数组只有在定义时才能使用初始化。
2.数组不能直接赋值给另一个数组。
3.在数组定义时就进行初始化时,数组大小可以不写,编译器会自动计算元素个数。
4.数组初始化时,当初始化的值少于数组大小时,未指定的元素会被编译器自动设置为0。
5.当数组需要指定所有值为A时,只需写成int ArrayName[10] = {1};即将数组的元素全指定为1。

//正确代码
	int a[4]={1,2,3,5}; // 1 2 3 5
	int b[] ={1,2,3}; // 1 2 3 没有指定数组大小,但编译器自动计数为3个元素。sizeof(b) = 12个byte(3*4byte),求数组长度应该为sizeof(b)/sizeof(b[0]);
	int c[3] = {0}; // 0 0 0
	int d[5]={0,1,2}; // 0 1 2 0 0 
	int h[3] = {}; // 0 0 0 大括号中什么不写,也是自动初始化为0,一般我们显示写比较好。

//错误示例
	int e[2] = {1,2,3}; //初始值设定项太多
	
	int f[4]; 
	f[4] = {1,2,3,4}; //采用{}方式初始化数组必须在定义的同时进行初始化,先定义再初始化是不行的,f[4]是表示一个元素,且索引还超出该数组的范围了。
	f = a; //错误提示: 左操作数必须为左值。因为不能直接将整个数组名直接赋值给另一个数组名。
	char  g[2] = {199.0, 2}; //-57 2  虽然编译不会报错,但199.0是double类型,和char转换存在精度损失,同时199.0超过了char的范围。

//纠正错误示例
int f[4];
//定义后再初始化,可以使用for循环对每个元素初始化,或者用memcopy从另一个数组复制的初始值,或者用memset统一初始化。

补充:左操作数必须为左值
通常我们认为表达式的等号左侧的数为左值,右侧的数为右值。一般,左值是一个变量(即存在内存地址)。

//以下两行代码在C++中会运行正常,且得到我们程序设计的正常结果,原因是C++会自动优化。
//但如果在C语言中,会编译报错,提示左操作数必须为左值。
int a=1,b=2,c;
c = a>b?a:b=10;  //原因等价于先计算表达式a>b?a:b,返回一个常量(常量不是变量,没地址),常量是无法被赋值成10的。

//在C语言中,正确写法
int a=1,b=2,c;
c = a>b?a:(b=10); //非要赋值,则需要加括号,c = 10。

二、数组的常规操作

  1. 数组结构的实现是使用顺序存储结构,是一种线性存储结构,对存储数据通常只有查找和修改操作。
  2. 数组的修改(插入和删除),其算法效率比较差。
  3. 数组可以有多维的,但顺序存储是一维的,所以数组的存储方式有两种:
    (1)以列为主(先列后行)。
    (2)以行为主(先行后列)——C语言一般采用该方法。

多维数组查找指定元素

需要确定如下信息:
(1)多维数组是以列为主还是以行为主?
(2)多维数组在内存中存放的首地址,一般就是数组名。
(3)数组的坐标索引。
(4)数组的数据类型——获取每个元素的字节数。
比如数组a[n][m],查找aij的位置,数据类型为int,以行序为主。
a[i][j]= (&a[0][0] + (im+j)*sizeof(int));


总结

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值